Oracle SQL:如何从列中提取指定目标词汇?
Oracle SQL提取指定目标词汇的解决方案
方法1:正则表达式替换(快速实现)
如果目标词汇固定,可通过两次正则替换先移除非目标词汇,再清理多余空格:
SELECT TRIM( REGEXP_REPLACE( REGEXP_REPLACE( description, -- 匹配所有非目标词汇的完整单词 '(^|\s)(?!MENACE|MORT|VIOLENCES|CONJOINT)(\S+)', '' ), -- 替换多个连续空格为单个空格 '\s+', ' ' ) ) AS extracted_terms FROM your_table;
- 将括号内的
MENACE|MORT|VIOLENCES|CONJOINT替换为你的50个目标词汇,用竖线|分隔即可。 - 正则中的
(^|\s)确保匹配完整单词,避免部分字符误匹配。
方法2:拆分单词+过滤拼接(易维护)
针对大量目标词汇(如50个),推荐用这种方式,目标词汇集中维护,逻辑更清晰:
-- 定义需要提取的目标词汇列表 WITH target_terms AS ( SELECT 'MENACE' AS term FROM DUAL UNION ALL SELECT 'MORT' AS term FROM DUAL UNION ALL SELECT 'VIOLENCES' AS term FROM DUAL UNION ALL SELECT 'CONJOINT' AS term FROM DUAL -- 继续添加剩余46个目标词汇,每个用UNION ALL连接 ), -- 拆分原字段中的每个单词 split_words AS ( SELECT t.id, -- 替换为你的表的唯一标识字段(如主键),无唯一标识可用ROWID代替 REGEXP_SUBSTR(t.description, '\S+', 1, LEVEL) AS word FROM your_table t CONNECT BY LEVEL <= REGEXP_COUNT(t.description, '\S+') AND PRIOR t.id = t.id AND PRIOR SYS_GUID() IS NOT NULL -- 防止递归循环 ) -- 过滤目标词汇并拼接成字符串 SELECT sw.id, LISTAGG(tt.term, ' ') WITHIN GROUP (ORDER BY sw.word) AS extracted_terms FROM split_words sw JOIN target_terms tt ON sw.word = tt.term GROUP BY sw.id;
- 优势:目标词汇集中在
target_terms中,增删词汇只需修改该部分,无需调整正则,降低出错概率。
内容的提问来源于stack exchange,提问作者pfroide4
相关产品推荐
相关产品推荐

