You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL如何查询Table_B中diagnosis(含逗号分隔值)至少一个在Table_A的记录

匹配效果示例

你原来的SQL只能实现Table_B.diagnosis整值完全等于Table_A.Diagnosis的匹配,遇到逗号分隔的多诊断值场景就会失效,可以用以下两种方案实现需求:

方案1:字符串模糊匹配(兼容大部分数据库)

通过补全逗号前后缀避免短编码误匹配长编码的问题,写法如下:

SELECT b.* 
FROM Table_B b
INNER JOIN Table_A a 
  ON CONCAT(',', b.diagnosis, ',') LIKE CONCAT('%,', a.Diagnosis, ',%')

适用场景:数据量小、不需要高频执行的查询,不需要修改原有表结构。
注意事项:需要保证两边的诊断值大小写、前后空格完全一致,否则会匹配失败。

方案2:拆分多值后精确匹配(性能更优、匹配更准确)

将Table_B中逗号分隔的诊断值拆分为单行后再和Table_A做等值匹配,不同数据库的拆分函数不同,常见数据库的实现如下:

  • MySQL 8.0及以上版本:
SELECT DISTINCT b.*
FROM Table_B b
JOIN JSON_TABLE(
  CONCAT('["', REPLACE(b.diagnosis, ',', '","'), '"]'),
  '$[*]' COLUMNS(diag_code VARCHAR(255) PATH '$')
) t
JOIN Table_A a ON t.diag_code = a.Diagnosis
  • PostgreSQL:
SELECT DISTINCT b.*
FROM Table_B b,
unnest(string_to_array(b.diagnosis, ',')) AS t(diag_code)
JOIN Table_A a ON t.diag_code = a.Diagnosis
  • SQL Server 2016及以上版本:
SELECT DISTINCT b.*
FROM Table_B b
CROSS APPLY STRING_SPLIT(b.diagnosis, ',') t
JOIN Table_A a ON t.value = a.Diagnosis

说明:代码中的DISTINCT是为了避免单条Table_B记录匹配到多个Table_A诊断时出现重复行,如果需要保留所有匹配到的诊断项可以删除该关键字。

内容的提问来源于stack exchange,提问作者Lehlohonolo Mapitsi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 00:18:03