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

SQL WHERE子句条件列动态选择写法咨询:模糊查询场景

处理方案

你可以用CASE表达式动态选择要匹配的字段,来满足“pid为空用a.pname,否则用b.name”的规则,同时完成模糊查询。这里需要先注意一个细节:原语句用的是INNER JOIN,而SQL里NULL不等于任何值(包括NULL),所以a.pid为空的记录根本不会通过a.pid = b.pid的关联条件,自然也不会出现在结果里。如果要包含这类记录,得把INNER JOIN改成LEFT JOIN。

对应WHERE子句写法

保持INNER JOIN的情况(只返回a.pid非空且与b.pid匹配的记录)

select *
from tbl_A a
inner join tbl_B b on a.pid = b.pid
where CASE 
         WHEN a.pid IS NULL THEN a.pname  -- 注:INNER JOIN下这个分支不会触发
         ELSE b.name 
       END LIKE CONCAT('%', @searchText, '%')

改为LEFT JOIN的情况(包含a.pid为空的tbl_A记录)

如果需要处理a.pid为空的场景,切换成LEFT JOIN后,WHERE子句可以这么写:

select *
from tbl_A a
left join tbl_B b on a.pid = b.pid
where CASE 
         WHEN a.pid IS NULL THEN a.pname 
         ELSE COALESCE(b.name, a.pname)  -- 可选:如果b.name为空时, fallback到a.pname
       END LIKE CONCAT('%', @searchText, '%')

额外说明

  • CASE表达式是SQL里实现条件分支的标准方式,能帮你动态选择匹配字段;
  • 用CONCAT拼接通配符和变量是更通用的写法,避免不同数据库里字符串拼接语法的差异;
  • 要是用INNER JOIN,a.pid IS NULL的分支永远不会生效,因为INNER JOIN只保留关联条件成立的记录,而NULL = NULL在SQL里不成立。

内容的提问来源于stack exchange,提问作者Vaibhav D

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 08:45:38