我正在Oracle中编写查询.
我想从右侧获取一个字符串,但字符串长度是动态的.
例如:
299123456789
我想得到123456789
substr(PHONE_NUMBERS,-X,Y)
Run Code Online (Sandbox Code Playgroud)
每个记录的X都不同.
我试过这个:
substr(PHONE_NUMBERS,-length(PHONE_NUMBERS),Y)
Run Code Online (Sandbox Code Playgroud)
它没有用..
我该怎么写这个查询?
San*_*ani 43
如果你想列出最后3个字符,最简单的方法是
select substr('123456',-3) from dual;
Run Code Online (Sandbox Code Playgroud)
Bha*_*rat 16
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
-
Run Code Online (Sandbox Code Playgroud)
如果你看上面的语句,3查询给出空值为-7> length('123456').
因此,检查的长度CONT_PHONE_NUMBERS
和PHONE_NUMBERS
希望这对你有所帮助
TF *_*rog 10
我刚刚发现这regexp_substr()
对于这个目的来说是完美的:)
我的挑战是从参考字符串中挑选右侧 16 个字符,理论上长度可以从 7 个字符到 250 个字符不等。当 时substr( OurReference , -16 )
返回让我很恼火。(另一方面,每当调用超出字符串边界时,Oracle 都会返回,这也是合乎逻辑的。)但是,我可以设置一个正则表达式来识别结尾之前任何字符的 1 到 16 之间的所有内容。字符串的:null
length( OurReference ) < 16
null
substr()
regexp_substr( OurReference , '.{1,16}$' )
Run Code Online (Sandbox Code Playgroud)
当涉及到正则表达式的性能问题时,我不能说哪个解决方案GREATER()
和这个解决方案表现最好。有人测试这个吗?一般来说,我的经验是,如果正则表达式写得整洁且良好(就像这个),那么它们会非常快。
祝你好运!:)
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
Run Code Online (Sandbox Code Playgroud)
调用greatest (-9, -length(string))
限制起始偏移量的结尾或字符串开头的9个字符.