【发布时间】:2019-07-31 07:48:01
【问题描述】:
我有一堆与操作系统相关的有效值,我需要检测哪些值显示在特定的文本列中。其中一些只是原始版本的演变,也包括在内,例如 1.'Windows 7 Professional' 和 2.'Windows 7'。
问题是每当我在描述文本中找到#1 时,#2 也会出现,但它不应该出现。
我尝试过标记较大的文本链,只要它们包含较小的记录,但老实说不知道以后如何操作(请参阅此之后的当前查询)。
WITH vv1 (valid_values) AS (
SELECT 'Windows 7'::text UNION ALL
SELECT 'Windows 7 Professional'::text UNION ALL
SELECT 'MacOS'::text UNION ALL
SELECT 'Linux'::text
)
, vv2 AS ( SELECT * FROM vv1 )
SELECT DISTINCT vv1.valid_values,CASE WHEN vv2.valid_values IS NOT NULL THEN vv2.valid_values END as includes
FROM vv1 LEFT OUTER JOIN vv2 ON (LOWER(vv1.valid_values) LIKE LOWER(vv2.valid_values)||'_%')
如果您只执行此查询(不需要 db),您将看到问题。第一行是“Windows 7”。
WITH vv1 (valid_values) AS (
SELECT 'Windows 7'::text UNION ALL
SELECT 'Windows 7 Professional'::text UNION ALL
SELECT 'MacOS'::text UNION ALL
SELECT 'Linux'::text
)
, txt (item_description) AS ( SELECT 'Computer with Linux or Windows 7 Professional'::text)
SELECT item_description, valid_values AS detected_os
FROM vv1, txt
WHERE item_description LIKE '%'||valid_values||'%'
预期结果是,当更大的文本链与描述字段中的结果匹配时,不会显示作为更大文本链一部分的有效值。在示例中,“Windows 7”不应是有效输出,因为“Windows 7 Professional”已与项目描述匹配。
【问题讨论】:
标签: sql regex amazon-redshift