Redshift:如何用LIKE条件实现表关联(支持多值匹配)
解决方案:关联包含多值逗号分隔字段的两张表
针对你遇到的问题,原SQL的匹配逻辑方向错误——应该判断TableA.column_A是否是TableB.Column_B中的一个独立项,而非反过来。下面提供两种可行方案:
方案1:字符串边界匹配(无需拆分,简单直接)
通过给TableB.Column_B前后添加分隔符,确保匹配的是完整的独立值,避免部分字符串误匹配:
SELECT a.column_A, b.Column_B FROM TableA a JOIN TableB b ON CONCAT(', ', b.Column_B, ', ') LIKE CONCAT('%, ', a.column_A, ', %')
说明:
CONCAT(', ', b.Column_B, ', ')会把Newyork, Dallas转换为, Newyork, Dallas,CONCAT('%, ', a.column_A, ', %')会生成匹配模式(比如%, Newyork, %),确保只匹配完整的独立项- 如果字段中存在多余空格,可以用
TRIM()函数处理,比如TRIM(a.column_A)和TRIM(b.Column_B)
方案2:拆分多值字段为行(更准确,适合复杂场景)
将TableB.Column_B中的逗号分隔值拆分为独立行,再与TableA关联,这种方法更可靠,尤其是当存在复杂的分隔规则时。以下是主流数据库的实现:
PostgreSQL
SELECT a.column_A, b.Column_B FROM TableA a JOIN ( SELECT Column_B, UNNEST(STRING_TO_ARRAY(TRIM(Column_B), ', ')) AS split_val FROM TableB ) b_split ON a.column_A = b_split.split_val JOIN TableB b ON b.Column_B = b_split.Column_B
MySQL 8.0+
-- 方法1:使用STRING_SPLIT(MySQL 8.0.19+支持) SELECT a.column_A, b.Column_B FROM TableA a JOIN ( SELECT Column_B, TRIM(value) AS split_val FROM TableB CROSS JOIN STRING_SPLIT(Column_B, ',') ) b_split ON a.column_A = b_split.split_val JOIN TableB b ON b.Column_B = b_split.Column_B -- 方法2:兼容更早版本的JSON_TABLE写法 SELECT a.column_A, b.Column_B FROM TableA a JOIN ( SELECT Column_B, TRIM(j.split_val) AS split_val FROM TableB CROSS JOIN JSON_TABLE( CONCAT('["', REPLACE(Column_B, ', ', '","'), '"]'), '$[*]' COLUMNS (split_val VARCHAR(255) PATH '$') ) j ) b_split ON a.column_A = b_split.split_val JOIN TableB b ON b.Column_B = b_split.Column_B
SQL Server
SELECT a.column_A, b.Column_B FROM TableA a JOIN ( SELECT Column_B, TRIM(value) AS split_val FROM TableB CROSS APPLY STRING_SPLIT(Column_B, ',') ) b_split ON a.column_A = b_split.split_val JOIN TableB b ON b.Column_B = b_split.Column_B
说明:
- 拆分后通过子查询生成包含单个值的临时表,再与原
TableB关联还原原始的Column_B值 TRIM()用于去除拆分后值前后的空格,确保匹配准确
内容的提问来源于stack exchange,提问作者Codegator
相关产品推荐
相关产品推荐

