我需要解析字符串,并且我很难识别订单号。
以下是几个有预期答案的例子。我需要Oracle SQL表达式来修改这个值。
SOURCE_COLUMN PARAMETER RETURN_VALUE
AAA_BBB_CCC_DDD AAA 1
AAA_BBB_CCCC_DDD BBB 2
AAA_BBB_CC_DDD CC 3
AAA_BBBB_CCC_DDD DDD 4
AAA_BBB_CCC_DDD EEE 0
下面是生成前两列的SQL
select 'AAA_BBB_CCC_DDD' SOURCE_COLUMN, 'AAA' PARAM FROM DUAL UNION ALL
select 'AAA_BBB_CCCC_DDD' SOURCE_COLUMN, 'BBB' PARAM FROM DUAL UNION ALL
select 'AAA_BBB_CC_DDD' SOURCE_COLUMN, 'CC' PARAM FROM DUAL UNION ALL
select 'AAA_BBBB_CCC_DDD' SOURCE_COLUMN, 'DDD' PARAM FROM DUAL UNION ALL
select 'AAA_BBB_CCC_DDD' SOURCE_COLUMN, 'EEE' PARAM FROM DUAL
发布于 2014-03-19 11:53:36
这个查询可以实现您想要的结果:
select (case when source_column like '%'||param||'%'
then 1 +
coalesce(length(substr(source_column, 1, instr(source_column, param) - 1)) -
length(replace(substr(source_column, 1, instr(source_column, param) - 1), '_', '')),
0)
else 0
end) as pos
from t;
这个想法比查询看起来简单得多。它找到匹配的参数,然后接受初始的子字符串直到那个点。您可以使用技巧来计算'_'
的数量:取字符串的长度,然后在用''
替换'_'
时减去字符串的长度。您想要的值实际上比此值多一个。如果找不到模式,则返回0
。
发布于 2014-03-19 11:52:42
对于您的特定示例(稳定的字符串模式):
SQL> with t as (
2 select 'AAA_BBB_CCC_DDD' SOURCE_COLUMN, 'AAA' PARAM FROM DUAL UNION ALL
3 select 'AAA_BBB_CCC_DDD' SOURCE_COLUMN, 'BBB' PARAM FROM DUAL UNION ALL
4 select 'AAA_BBB_CCC_DDD' SOURCE_COLUMN, 'CCC' PARAM FROM DUAL UNION ALL
5 select 'AAA_BBB_CCC_DDD' SOURCE_COLUMN, 'DDD' PARAM FROM DUAL UNION ALL
6 select 'AAA_BBB_CCC_DDD' SOURCE_COLUMN, 'EEE' PARAM FROM DUAL
7 )
8 select SOURCE_COLUMN, PARAM, floor((instr(SOURCE_COLUMN,param)+3)/4) p from t;
SOURCE_COLUMN PAR P
--------------- --- ----------
AAA_BBB_CCC_DDD AAA 1
AAA_BBB_CCC_DDD BBB 2
AAA_BBB_CCC_DDD CCC 3
AAA_BBB_CCC_DDD DDD 4
AAA_BBB_CCC_DDD EEE 0
https://stackoverflow.com/questions/22516410
复制相似问题