Oracleでクエリを作成しています。
右側から文字列を取得したいのですが、文字列の長さは動的です。
例:
299123456789
123456789を取得したい
substr(PHONE_NUMBERS,-X,Y)
Xはレコードごとに異なります。
私はこれを試しました:
substr(PHONE_NUMBERS,-length(PHONE_NUMBERS),Y)
うまくいきませんでした。
このクエリを作成するにはどうすればよいですか?
最後の3文字をリストしたい場合、最も簡単な方法は
select substr('123456',-3) from dual;
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_NUMBERS
とPHONE_NUMBERS
の長さを確認してください
これがあなたを助けることを願っています
_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文字左または先頭から制限します。
regexp_substr()
がこの目的に最適であることがわかりました:)
私の挑戦は、参照文字列から右側の16文字を選択することです。この文字列は、理論上は7から250の長さのすべての文字になります。 substr( OurReference , -16 )
のときにlength( OurReference ) < 16
がnull
を返すのは困ります。 (一方で、論理的にも、Oracleはsubstr()
への呼び出しが文字列の境界を超えるたびにnull
を返すのです。)ただし、文字列の末尾の直前の1〜16文字のすべてを認識する正規表現:
_regexp_substr( OurReference , '.{1,16}$' )
_
正規表現に関するパフォーマンスの問題に関しては、どのGREATER()
ソリューションが最適かを言うことはできません。 誰もがこれをテストしますか?通常、正規表現がきちんと書かれていれば(このように)正規表現は非常に高速であることを経験しました。
がんばろう! :)
substr(PHONE_NUMBERS, length(PHONE_NUMBERS) - 3, 4)
パターンは次のようになります。
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)