web-dev-qa-db-ja.com

右側から文字列を取得

Oracleでクエリを作成しています。

右側から文字列を取得したいのですが、文字列の長さは動的です。

例:

299123456789

123456789を取得したい

substr(PHONE_NUMBERS,-X,Y)

Xはレコードごとに異なります。

私はこれを試しました:

substr(PHONE_NUMBERS,-length(PHONE_NUMBERS),Y)

うまくいきませんでした。

このクエリを作成するにはどうすればよいですか?

20
Jack

最後の3文字をリストしたい場合、最も簡単な方法は

 select substr('123456',-3) from dual;
41
SQL> select substr('123456',-1,6) from dual;

S
-
6

SQL> select substr('123456',-6,6) from dual;

SUBSTR
------
123456

SQL> select substr('123456',-7,6) from dual;

S
-

上記のステートメントを見ると、3クエリは-7> length( '123456')としてnull値を返します。

CONT_PHONE_NUMBERSPHONE_NUMBERSの長さを確認してください

これがあなたを助けることを願っています

16
Bharat
_SQL> select substr('999123456789', greatest (-9, -length('999123456789')), 9) as value from dual;

VALUE
---------
123456789

SQL> select substr('12345', greatest (-9,  -length('12345')), 9) as value from dual;

VALUE
----
12345
_

greatest (-9, -length(string))の呼び出しは、開始オフセットを、文字列の末尾から9文字左または先頭から制限します。

7
Adam Musch

regexp_substr()がこの目的に最適であることがわかりました:)

私の挑戦は、参照文字列から右側の16文字を選択することです。この文字列は、理論上は7から250の長さのすべての文字になります。 substr( OurReference , -16 )のときにlength( OurReference ) < 16nullを返すのは困ります。 (一方で、論理的にも、Oracleはsubstr()への呼び出しが文字列の境界を超えるたびにnullを返すのです。)ただし、文字列の末尾の直前の1〜16文字のすべてを認識する正規表現:

_regexp_substr( OurReference , '.{1,16}$' )
_

正規表現に関するパフォーマンスの問題に関しては、どのGREATER()ソリューションが最適かを言うことはできません。 誰もがこれをテストしますか?通常、正規表現がきちんと書かれていれば(このように)正規表現は非常に高速であることを経験しました。

がんばろう! :)

4
TF Krog
substr(PHONE_NUMBERS, length(PHONE_NUMBERS) - 3, 4)
3
Joe User

パターンは次のようになります。

substr(STRING, ( length(STRING) - (TOTAL_GET_LENGTH - 1) ),TOTAL_GET_LENGTH)

あなたの場合、これは次のようになります:

substr('299123456789', (length('299123456789')-(9 - 1)),9)

substr('299123456789', (12-8),9)

substr('299123456789', 4,9)

the result ? of course '123456789'

長さは動的で、出来上がりです:)

SELECT SUBSTR('299123456789',DECODE(least(LENGTH('299123456789'),9),9,-9,LENGTH('299123456789')*-1)) value from dual  

与える123456789

数字が9桁未満の場合でも同じステートメントが機能します。

SELECT SUBSTR('6789',DECODE(least(LENGTH('6789'),9),9,-9,LENGTH('6789')*-1)) value from dual  

与える6789

私も同じ問題を抱えていました。これは私のために働いた:

 CASE WHEN length(sp.tele_phone_number) = 10 THEN
                   SUBSTR(sp.tele_phone_number,4)
0
Clayton