Oracle SQL如何在临时输出列提取以business_开头的字段值?
解决方案:提取STATISTICS字段中business_开头的内容
当然可以实现!而且完全不用正则表达式,靠字符串定位和截取函数就能搞定,咱们直接上干货。
核心思路
你的STATISTICS字段是用; (分号加空格)分隔的多个值,我们需要:
- 定位到
business_在字符串中的起始位置 - 找到该位置之后第一个
;的位置(如果存在的话) - 截取这两个位置之间的内容;如果
business_内容在最后,就截取到字符串末尾
针对Oracle的SQL实现(匹配你原查询的语法)
因为你原查询用了TRUNC(CREATEDFORMAT),看起来是Oracle环境,直接用这个语句:
SELECT PKEY, TRUNC(CREATEDFORMAT), SUBSTR(STATISTICS, INSTR(STATISTICS, 'business_'), CASE WHEN INSTR(STATISTICS, '; ', INSTR(STATISTICS, 'business_')) > 0 THEN INSTR(STATISTICS, '; ', INSTR(STATISTICS, 'business_')) - INSTR(STATISTICS, 'business_') ELSE LENGTH(STATISTICS) - INSTR(STATISTICS, 'business_') + 1 END) AS NEW_STATISTICS FROM BUSINESS_DATA WHERE STATISTICS LIKE '%business_%';
逻辑拆解
INSTR(STATISTICS, 'business_'):找到business_在字符串中第一次出现的起始索引INSTR(STATISTICS, '; ', INSTR(STATISTICS, 'business_')):从business_的位置开始,找下一个;的索引CASE语句判断:如果找到后续的;,就截取到该位置;如果没找到,就截取到字符串末尾SUBSTR负责最终的内容提取
其他数据库适配(比如MySQL)
如果是MySQL环境,只需要把函数换成对应的即可:
SELECT PKEY, DATE(CREATEDFORMAT), -- 用DATE替代Oracle的TRUNC SUBSTRING(STATISTICS, LOCATE('business_', STATISTICS), CASE WHEN LOCATE('; ', STATISTICS, LOCATE('business_', STATISTICS)) > 0 THEN LOCATE('; ', STATISTICS, LOCATE('business_', STATISTICS)) - LOCATE('business_', STATISTICS) ELSE LENGTH(STATISTICS) - LOCATE('business_', STATISTICS) + 1 END) AS NEW_STATISTICS FROM BUSINESS_DATA WHERE STATISTICS LIKE '%business_%';
补充说明
如果你的STATISTICS字段中存在多个business_开头的内容,上面的语句只会提取第一个。如果需要提取所有符合条件的内容,可能需要先把字符串拆分成多行再合并,但从你的示例来看,每条记录只有一个目标值,这个方案完全够用。
内容的提问来源于stack exchange,提问作者user13678730
相关产品推荐
相关产品推荐

