在Amazon Redshift中查询包含表B关键词的表A所有行的SQL实现
问题描述
在Amazon Redshift数据库中,我有一张包含数十万行数据的表A,其包含一个存储字符串的name字段,数据示例如下:
| Name |
|---|
| Thor |
| Spiderman |
| The Amazing Spiderman |
| Superman |
| Hulk |
| Jonas The Fish |
| Fish Billy |
另有一张包含数千行数据的表B,其包含一个存储关键词的Keyword字段,数据示例如下:
| Keyword |
|---|
| Amazing Spiderman |
| Fish |
需要从表A中筛选出所有包含表B中任意关键词的行,期望结果如下:
| Name |
|---|
| The Amazing Spiderman |
| Jonas The Fish |
| Fish Billy |
请问实现该需求的正确SQL语句是什么?
解决方案
你可以通过关联查询结合字符串匹配逻辑实现需求,Redshift支持两种常用写法:
方法一:使用LIKE模糊匹配
SELECT DISTINCT a.name FROM table_a a JOIN table_b b ON a.name LIKE '%' || b.keyword || '%';
- 用
||拼接通配符与关键词,构造包含匹配的条件 - 加
DISTINCT避免表B存在多个匹配关键词时,表A的同一条记录重复输出
方法二:使用POSITION函数
SELECT DISTINCT a.name FROM table_a a JOIN table_b b ON POSITION(b.keyword IN a.name) > 0;
POSITION函数返回关键词在name字段中的起始位置,返回值大于0即代表包含该关键词- 同样用
DISTINCT保证结果唯一性
性能优化提示
因为表A数据量较大,关联查询可能产生性能开销,可尝试:
- 给表A的
name字段创建全文索引(若业务场景允许) - 提前清理表B中的无效、重复关键词,减少关联匹配次数
内容的提问来源于stack exchange,提问作者Boby
相关产品推荐
相关产品推荐

