我正在Oracle中编写一个查询。
我想从右侧获取一个字符串,但字符串长度是动态的。
例如:
299123456789
我想得到123456789
substr(PHONE_NUMBERS,-X,Y)
每条记录的X都不同。
我试过了:
substr(PHONE_NUMBERS,-length(PHONE_NUMBERS),Y)
它不起作用..
如何撰写此查询?
答案 0 :(得分:37)
如果你想列出最后3个字符,最简单的方法是
select substr('123456',-3) from dual;
答案 1 :(得分: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
-
如果你看上面的陈述,3查询给出空值为-7>长度( '123456')。
请检查CONT_PHONE_NUMBERS
和PHONE_NUMBERS
希望这有助于你
答案 2 :(得分:7)
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个字符。
答案 3 :(得分:4)
我刚刚发现regexp_substr()
非常适合此目的:)
我的挑战是从参考字符串中选择右手16个字符,理论上可以是从7个字到250个字符长的所有字符。在substr( OurReference , -16 )
时null
返回length( OurReference ) < 16
让我感到很恼火。 (另一方面,只要对null
的调用超出字符串的边界,Oracle就会返回substr()
也是合乎逻辑的。)但是,我可以将正则表达式设置为在字符串结尾之前识别任何字符的1到16之间的所有内容:
regexp_substr( OurReference , '.{1,16}$' )
当遇到有关正则表达式的性能问题时,我不能说哪个GREATER()
解决方案和这个解决方案表现最佳。 有人测试过这个吗?一般来说,我经历过正则表达式非常快,如果它们写得很整齐(就像这个那样)。
答案 4 :(得分:3)
substr(PHONE_NUMBERS, length(PHONE_NUMBERS) - 3, 4)
答案 5 :(得分:2)
模式可能如下所示:
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'
长度是动态的,瞧:):
答案 6 :(得分:1)
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
答案 7 :(得分:0)
我有同样的问题。这对我有用:
CASE WHEN length(sp.tele_phone_number) = 10 THEN
SUBSTR(sp.tele_phone_number,4)
答案 8 :(得分:0)
以下解决方案非常适合此目的:
select mod('299123456789',1000000000) from dual;
答案 9 :(得分:-1)
最简单的解决方案:
substr('299123456',-6,6)