SQL需求:拆分T1表TITLE字段,匹配T2表DESCRIPTION并返回结果
现有数据表
T1表结构及数据
| TITLE |
|---|
| age 5 alton john live |
| show must go on |
T2表结构及数据
| NAME | DESCRIPTION |
|---|---|
| John Bo | alton for kids |
| Alton | show age kids |
需求说明
将T1表的TITLE字段按空格拆分为单个单词令牌,检查是否至少有一个令牌完整出现在T2表的DESCRIPTION字段中,返回所有符合匹配条件的TITLE与DESCRIPTION组合。
解决方案(MySQL示例)
WITH RECURSIVE split_title AS ( SELECT TITLE, SUBSTRING_INDEX(TITLE, ' ', 1) AS token, SUBSTRING(TITLE, LENGTH(SUBSTRING_INDEX(TITLE, ' ', 1)) + 2) AS remaining FROM T1 UNION ALL SELECT TITLE, SUBSTRING_INDEX(remaining, ' ', 1) AS token, SUBSTRING(remaining, LENGTH(SUBSTRING_INDEX(remaining, ' ', 1)) + 2) AS remaining FROM split_title WHERE remaining != '' ) SELECT DISTINCT t.TITLE, t2.DESCRIPTION FROM T1 t JOIN split_title st ON t.TITLE = st.TITLE JOIN T2 t2 ON t2.DESCRIPTION LIKE CONCAT('% ', st.token, ' %') OR t2.DESCRIPTION LIKE CONCAT(st.token, ' %') OR t2.DESCRIPTION LIKE CONCAT('% ', st.token) OR t2.DESCRIPTION = st.token;
注:递归CTE用于拆分TITLE为单个令牌,通过多条件模糊匹配确保是完整单词匹配,避免部分字符误匹配,最后通过DISTINCT去重得到结果。
预期输出
| TITLE | DESCRIPTION |
|---|---|
| age 5 alton john live | alton for kids |
| age 5 alton john live | show age kids |
| show must go on | show age kids |
内容的提问来源于stack exchange,提问作者userit1985
相关产品推荐
相关产品推荐

