搜索substring,返回另一个子字符串

时间:2014-05-07 19:06:45

标签: sql oracle substr

我需要搜索并显示字符串字段的一部分。从记录到记录的字符串值可能不同。例如:


记录#1

字符串值:

IA_UnsafesclchOffense0IA_ReceivedEdServDuringExp0IA_SeriousBodilyInjuryN

记录#2

字符串值:

 IA_ReasonForRemovalTIA_Beh_Inc_Num1392137419IA_RemovalTypeNIA_UnsafesclchOffense0IA_ReceivedEdServDuringExp0IA_SeriousBodilyInjuryN

记录#3

字符串值:

IA_UnsafesclchOffense0IA_RemovalTypeSIA_ReasonForRemovalPIA_ReceivedEdServDuringExp0IA_Beh_Inc_Num1396032888IA_SeriousBodilyInjuryN

在每种情况下,我都需要搜索IA_Beh_Inc_Num。假设找到它,并且如果它后跟数字数据,我想返回该数据的数字部分。数字数据(如果存在)将始终为10个字符。 换句话说,记录#1不应返回值,记录#2应返回1392137419,记录#3应返回1396032888

有没有办法在select语句中执行此操作而无需使用PL / SQL编写完整函数?

4 个答案:

答案 0 :(得分:2)

使用正则表达式应该很容易:找到一个搜索字符串并检查它是否后跟10位数字:

REGEXP_SUBSTR(col, '(?<=IA_Beh_Inc_Num)([0-9]{10})')

但Oracle似乎不支持RegEx lookahead ,所以它有点复杂:

REGEXP_SUBSTR(value, '(IA_Beh_Inc_Num)([0-9]{10})',1,1,'i',2)

备注:搜索不区分大小写,如果小于10位,则返回NULL。

答案 1 :(得分:1)

这样可行:

SELECT 
CASE WHEN instr(value, 'IA_Beh_Inc_Num') > 0
     THEN substr(substr(value, instr(value, 'IA_Beh_Inc_Num'), 25),15,10)
     ELSE 'not found'
END AS result
FROM example

请参阅此SQL Fiddle

答案 2 :(得分:1)

问题是,Angelo的回答对Oracle来说是正确的。 对于那些来自SQL Server的人来说,下面的内容可行:

SELECT CASE 
        WHEN CHARINDEX('IA_Beh_Inc_Num', StringColumn) = 0
            THEN NULL
        ELSE SUBSTRING(StringColumn, CHARINDEX('IA_Beh_Inc_Num', StringColumn) + LEN('IA_Beh_Inc_Num'), 10)
        END AS unix_time
    ,*
FROM MyTable

答案 3 :(得分:0)

修改

修改查询以选择所有行。查询打印&#34; NOT A TIMESTAMP&#34;如果字符串中不存在IA_Beh_Inc_Num,或者后面没有10个数字。

SELECT
  DECODE
    (
    REGEXP_INSTR (value, 'IA_Beh_Inc_Num[0-9]{10}'), 
    0, 
    'NOT A TIMESTAMP', 
    SUBSTR(value, INSTR(value, 'IA_Beh_Inc_Num')+14, 10)
    ) timestamp
FROM example;

SQL Fiddle