SQL动态筛选需求:优化带OR条件的Customer表查询语句
优化SQL查询以实现动态参数过滤
当前使用的SQL语句
Select * from Customer Where Acc = '26A' and ( OrderNo = '111' OR OrderNo <> ' ')
当前查询返回结果
| Acc | Order No |
|---|---|
| 26A | 111 |
| 26A | 112 |
| 26A | 113 |
原始Customer表数据
| Acc | Order No |
|---|---|
| 26A | 111 |
| 26A | 112 |
| 26A | 113 |
| 26B | 114 |
| 26B | 115 |
| 26B | 116 |
需求说明
需要优化上述查询,实现以下逻辑:
- 当同时传入Acc编号和OrderNo时,仅返回匹配这两个参数的记录
- 当未传入OrderNo时,返回该Acc编号下的所有记录
当前查询仅完成了Acc编号的过滤,无法满足上述需求。
优化后的SQL语句
假设使用参数@Acc(传入的Acc编号)和@OrderNo(传入的订单号,未传入时为NULL或空字符串),优化后的查询如下:
SELECT * FROM Customer WHERE Acc = @Acc AND (OrderNo = @OrderNo OR @OrderNo IS NULL OR @OrderNo = '')
逻辑说明
- 先通过
Acc = @Acc过滤出指定账户下的所有记录 - 针对OrderNo参数做判断:
- 如果
@OrderNo有有效值(非空、非空字符串),则只保留OrderNo匹配该参数的记录 - 如果
@OrderNo为空或空字符串,则不对OrderNo做额外限制,返回该账户下的所有记录
- 如果
内容的提问来源于stack exchange,提问作者Randy
相关产品推荐
相关产品推荐

