从右手边获取字符串

时间:2010-08-09 14:13:56

标签: oracle plsql

我正在Oracle中编写一个查询。

我想从右侧获取一个字符串,但字符串长度是动态的。

例如:

299123456789

我想得到123456789

substr(PHONE_NUMBERS,-X,Y)

每条记录的X都不同。

我试过了:

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

它不起作用..

如何撰写此查询?

10 个答案:

答案 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_NUMBERSPHONE_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)