匹配 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
我知道 LIKE
和 SIMILAR 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 中逗号分隔字段中的值的主要内容,如果未能解决你的问题,请参考以下文章