我需要搜索并显示字符串字段的一部分。从记录到记录的字符串值可能不同。例如:
记录#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编写完整函数?
答案 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)
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;