用逗号分隔的字符串连接表(使用 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这样的逗号分隔列表,它应该是相关的表,将这些值保存在不同的记录234123(当然还有一个返回表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)的主要内容,如果未能解决你的问题,请参考以下文章

Where子句Mysql中的逗号分隔字符串参数过滤器

使用 SQL Server 将逗号分隔的文本转换为多列结果

通过连接来自不同列的逗号分隔值来创建字符串

如何将字符串列表连接在一起,每个值之间用逗号分隔?

SQL语句,字段表里某列数据变为用逗号分隔的字符串

用逗号分隔表的查询是交叉连接查询吗?