用逗号分隔的字符串连接表(使用 WHERE)
Posted
技术标签:
【中文标题】用逗号分隔的字符串连接表(使用 WHERE)【英文标题】:Join tables with comma separated string (using WHERE) 【发布时间】:2015-12-30 15:31:21 【问题描述】:我有两张表,我们称它为表 A 和表 B。它们看起来像:
A.col1 A.colX B.colY
1 123 123
2 234, 123 234
3 2, 52352 2
52352
我要做的是JOIN
他们,很可能使用WHERE
,因为我的环境不支持非等连接。我有表A
的问题,其中数字是字符串。我尝试了解决方案:
SELECT...
FROM A, B
WHERE A.colX LIKE concat('%', B.colY, '%')
但它不能正常工作,例如来自B.colY
的值2
出现在表A.colX
的每个字符串中。
最后的例子是我想要实现的:
output
1 123 -------> 123
2 234, 123 --> 234
1 234, 123 --> 123
3 2, 52352 --> 2
3 2, 52352 --> 52352
你对此有什么想法吗?
【问题讨论】:
首先 - 这绝对是糟糕的表模式设计。而不是像A.colX
中的234, 123
这样的逗号分隔列表,它应该是相关的表,将这些值保存在不同的记录234
、123
(当然还有一个返回表A的外键)。有了这个单独的表,您就可以摆脱复杂的连接条件。
B.colY 的数据类型?
我同意你的观点,但是这些数据来自上传到数据库的 excel 文件。这两个表是与 excel 不同的电子表格。
两列的数据类型不同,但我使用 Cast() 将其转换(从 bigint 到 varchar)
【参考方案1】:
where (',' || replace(A.colX,' ','') || ',') LIKE ('%,' || B.colY || ',%')
即从 A.colX 中删除空格,在前后添加一个逗号,然后使用 B.colY 执行 like
也使用逗号。
||
是ANSI SQL的拼接方式,部分产品使用CONCAT
或+
代替。
【讨论】:
看起来它就像一个魅力 :) 对您的代码的一条评论,在替换功能中应该有:replace(A.colX,',' ,''),一个标志太多了代码。谢谢! 糟糕,已修复。感谢您通知我! 经过短暂调查,我发现它无法正常工作。缺少逗号分隔字符串中的值。有什么解决办法吗? 奇数。这个对我有用。您是否调整了语法以适应 dbms? 知道了!您再次更改了替换功能。我有它就像上面的2个帖子。现在我的输出中出现了来自字符串的重复值 :) 再次感谢您 :)【参考方案2】:您可以将字符串 split() 成一个数组,然后 unnest() 为每个部分生成单独的行,然后执行常规连接。
https://prestodb.io/docs/current/functions/string.html#split
https://prestodb.io/docs/current/sql/select.html#unnest
【讨论】:
以上是关于用逗号分隔的字符串连接表(使用 WHERE)的主要内容,如果未能解决你的问题,请参考以下文章