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

在Oracle中如何在第一个和第二个空格后获取子字符串,oracle,oracle11g,Oracle,Oracle11g,我在oracle中遇到了一个问题,即我的保单编号为'125896547 0101',我需要一个子字符串为'125896547'。应删除数字后的第一个空格和第二个空格。我将查询用作 substr(RC_POLICY_NO,1,instr(RC_POLICY_NO,'')) 这不起作用,请建议。您可以使用,从您的值中获取第一个连续数字字符串: regexp_substr(RC_POLICY_NO, '\d+') 或第一个和第二个空格块之间的所有字符: regexp_substr(RC_POL

我在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
假设在您想要的字符串后面总是有一个空格;如果您可能从一个没有两个字符块的值开始,那么您需要做更多的工作

如果这是您经常要做的事情,那么添加一个虚拟列和/或基于函数的索引可能是值得的,这样您就可以更轻松地搜索特定值。

您可以这样做,从值中获取第一个连续数字字符串:

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
假设在您想要的字符串后面总是有一个空格;如果您可能从一个没有两个字符块的值开始,那么您需要做更多的工作


如果这是您经常要做的事情,那么添加一个虚拟列和/或基于函数的索引可能是值得的,这样您就可以更轻松地搜索特定值。

我没有Oracle实例来检查这一点,但这是一开始导致您出现问题的空间吗

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

试着先修一下

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

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

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

试着先修一下

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

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

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

例如,执行上述查询时的输出为125896547。

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

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

例如,执行上述查询时的输出为125896547。

第一个空格和第二个空格?你能详细说明一下吗?您的意思是要删除空格和空格后的数字(在您的示例中为0101)保单编号之间有两个空格吗?你的要求是把空格前的数字写对吗?第一个空格和第二个空格?你能详细说明一下吗?您的意思是要删除空格和空格后的数字(在您的示例中为0101)保单编号之间有两个空格吗?您的要求是在空格前输入正确的数字?我使用您的查询作为选择RC_付款方式、RC_保单编号、从D040100开始投保的RC_,其中substr(RC_保单编号,“\d+”)='6306582';但是给予是无效的number@Mandrek-再次查看-我使用了
regexp\u substr()
,而不是
substr()
。我使用您的查询作为选择RC\u付款方法、RC\u保单号、从D040100开始投保的RC\u,其中substr(RC\u保单号,“\d+”)='6306582';但是给予是无效的number@Mandrek-再看看-我用的是
regexp\u substr()
,而不是
substr()