如何在Oracle中的第一个和第二个空格之后获取子字符串

时间:2017-05-09 12:07:19

标签: oracle oracle11g

我在oracle中遇到问题,即我的策略号为' 125896547 0101',我需要一个子串为'125896547'。应删除第一个空格和数字后的第二个空格。我正在使用查询

 substr(RC_POLICY_NO,1,instr(RC_POLICY_NO,'')) 

哪个无效,请建议。

3 个答案:

答案 0 :(得分:1)

您可以使用a regular expression执行此操作,以从您的值中获取第一个连续数字字符串:

regexp_substr(RC_POLICY_NO, '\d+')

或第一个和第二个空格块之间的所有字符:

regexp_substr(RC_POLICY_NO, '[^ ]+')

快速演示:

with t (RC_POLICY_NO) as (select '  125896547        0101' from dual)
select regexp_substr(RC_POLICY_NO, '\d+'), regexp_substr(RC_POLICY_NO, '[^ ]+')
from t;

REGEXP_SU REGEXP_SU
--------- ---------
125896547 125896547

你可以使用普通substr(),但你需要搜索一个spave而不是null,就像你现在所做的那样;并删除前导空格,您可以先修剪它:

substr(ltrim(RC_POLICY_NO), 1, instr(ltrim(RC_POLICY_NO), ' ') - 1)

该方法的演示:

with t (RC_POLICY_NO) as (select '  125896547        0101' from dual)
select substr(ltrim(RC_POLICY_NO), 1, instr(ltrim(RC_POLICY_NO), ' ') - 1)
from t;

SUBSTR(LT
---------
125896547

假设在你想要的字符串之后总会有一个空格;如果你可能从一个没有两个字符块的值开始,那么你需要做更多的工作。

如果您需要做很多事情,可能需要添加虚拟列和/或基于函数的索引,以便您可以更轻松地搜索特定值。

答案 1 :(得分:1)

您可以使用以下查询选择空格前的数字。

SELECT 
     REGEXP_SUBSTR ( RC_POLICY_NO , '[^ ]+' , 1 , 1 ),
FROM DUAL ;

执行上述查询时的输出结果为125896547。

答案 2 :(得分:0)

我没有Oracle实例来检查这个问题,但是它是一开始会导致问题的空间。

您的代码正在从第1个字符到空格字符的第一个实例,这也是字符串中的第一个字符

首先尝试修剪

substr(LTRIM((RC_POLICY_NO,1,instr(RC_POLICY_NO,'')),' ')