通过在 where 子句中传递值来选择数据,如果值匹配则返回该数据,否则返回所有数据
Posted
技术标签:
【中文标题】通过在 where 子句中传递值来选择数据,如果值匹配则返回该数据,否则返回所有数据【英文标题】:select data by passing a value in where clause if the value match then return that data otherwise return all data 【发布时间】:2020-07-07 07:13:36 【问题描述】:通过在where子句中传递一个值来选择数据,如果值匹配则返回匹配数据,否则返回所有数据。 考虑以下示例
身份证名称 1个ABC 2 防御 3 GHI 4 JKL当传递id = 1 时返回第1 行,传递空值或0 则返回所有数据。
【问题讨论】:
where id = &value or &value = 0 or &value is null
【参考方案1】:
您可以使用如下解析函数:
SELECT * FROM
(SELECT T.*,
SUM(CASE WHEN T.ID = <YOUR_VALUE(0,1,NULL, or any)> THEN 1 ELSE 0 END) OVER () AS SM
FROM YOUR_TABLE T)
WHERE SM = 0 OR ID = <YOUR_VALUE(0,1,NULL, or any)>
您需要将<YOUR_VALUE(0,1,NULL)>
替换为您要传递的值。
对于值 0 和 1,结果如下:
SQL> SELECT * FROM
2 (SELECT T.*,
3 SUM(CASE WHEN T.ID = 0 THEN 1 ELSE 0 END) OVER () AS SM
4 FROM YOUR_TABLE T)
5 WHERE SM = 0 OR ID = 0 ;
ID NAM SM
---------- --- ----------
1 ABC 0
2 DEF 0
3 GHI 0
4 JKL 0
SQL>
SQL>
SQL> SELECT * FROM
2 (SELECT T.*,
3 SUM(CASE WHEN T.ID = 1 THEN 1 ELSE 0 END) OVER () AS SM
4 FROM YOUR_TABLE T)
5 WHERE SM = 0 OR ID = 1;
ID NAM SM
---------- --- ----------
1 ABC 1
SQL>
【讨论】:
【参考方案2】:你可以使用not exists
:
select t.*
from t
where id = 1 or
not exists (select 1 from t t2 where t2.id = 1);
或者作为传入的值:
select t.*
from t
where id = :input or
not exists (select 1 from t t2 where t2.id = :input);
请注意,这也适用于 NULL
值,因为如果 :input
是 NULL
,子查询中的 where
将评估为 NULL
。
【讨论】:
以上是关于通过在 where 子句中传递值来选择数据,如果值匹配则返回该数据,否则返回所有数据的主要内容,如果未能解决你的问题,请参考以下文章
SQL HELP - 基于 BIT 变量的条件 where 子句 - SQL Server
Redshift - 在 where 子句中从 csv 传递值