匹配 Redshift 中逗号分隔字段中的值

Posted

技术标签:

【中文标题】匹配 Redshift 中逗号分隔字段中的值【英文标题】:Matching values in a comma seprated field in Redshift 【发布时间】:2020-12-21 23:17:52 【问题描述】:

我在Redshift 有 2 个表,如下:

T1:

QID   EID
Q1    a.1,a.2
Q2    a.5,a.4,a.8
Q3    a.7
Q4    a.3,a.5

T2:

EIDs
a.1
a.2
a.4
a.7

我只想从T1 中选择包含T2.EIDs 中任何可用值的记录。 因此,如果T2.EIDs 中存在的任何值在逗号分隔字段T1.EID 中可用,那么我想从T1 中选择该记录。对于给定的示例,这是我想要的结果集:

QID   EID
Q1    a.1,a.2
Q2    a.5,a.4,a.8
Q3    a.7

我知道 LIKESIMILAR TO 子句会在这里发挥作用,但我似乎无法想出让它起作用的东西。

最终的查询可能类似于:

SELECT T1.*
FROM T1 JOIN T2 ON <cannot think of a proper join condition>

任何帮助将不胜感激。

【问题讨论】:

您有机会修复损坏的数据模型吗?这是解决这个问题的唯一正确方法。 @a_horse_with_no_name 不幸的是,我现在无法修复数据模型。但是下面发布的答案可以在不更改数据模型的情况下解决问题。 【参考方案1】:

这是一个糟糕的数据模型。 CSV 列表中的每个值都应该存储在不同的行中,而不是连接在一个字符串中。那么查询将是易于编写和高效的。

对于您当前的设计,您可以使用如下字符串函数:

select t1.*
fom t1
where exists (select 1 from t2 where ',' || t1.eid || ',' like '%,' || t2.eid || ',%')

【讨论】:

非常感谢您的回答。它工作得很好,除了我必须纠正的一个小错字。 exists 条件具有 t2.eid,。应删除逗号以使其正常工作。这确实是一个糟糕的数据模型,但这是我目前必须使用的。

以上是关于匹配 Redshift 中逗号分隔字段中的值的主要内容,如果未能解决你的问题,请参考以下文章

mysql 两个以逗号分隔字段怎么匹配

将逗号分隔的值与 MySQL 中的单列值匹配 [重复]

sql 如何以逗号为分隔符分割一个字段的值

如何在 Amazon Redshift 的列中取消嵌套/展开/展平逗号分隔值?

如何在Javascript中用逗号分隔的值匹配数组?

使用正则表达式匹配多个逗号分隔的单词