【发布时间】: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
通过在where子句中传递一个值来选择数据,如果值匹配则返回匹配数据,否则返回所有数据。 考虑以下示例
身份证名称 1个ABC 2 防御 3 GHI 4 JKL当传递id = 1 时返回第1 行,传递空值或0 则返回所有数据。
【问题讨论】:
where id = &value or &value = 0 or &value is null
您可以使用如下解析函数:
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>
【讨论】:
你可以使用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。
【讨论】: