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



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

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

这是不工作的,请建议。

您可以使用正则表达式执行此操作,以从您的值中获取第一个连续数字字符串:

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

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

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

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

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

对于您的示例,执行上述查询时的输出125896547。

我没有 Oracle 实例来检查这一点,但是否是开头的空间导致了您的问题。

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

尝试先修剪它

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

最新更新