我在oracle中遇到问题,即我的策略号为' 125896547 0101'
,我需要一个子串为'125896547'
。应删除第一个空格和数字后的第二个空格。我正在使用查询
substr(RC_POLICY_NO,1,instr(RC_POLICY_NO,''))
哪个无效,请建议。
答案 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,'')),' ')