通过在 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)>

您需要将&lt;YOUR_VALUE(0,1,NULL)&gt; 替换为您要传递的值。

对于值 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 值,因为如果 :inputNULL,子查询中的 where 将评估为 NULL

【讨论】:

以上是关于通过在 where 子句中传递值来选择数据,如果值匹配则返回该数据,否则返回所有数据的主要内容,如果未能解决你的问题,请参考以下文章

选择不同的值,传递到 Where 子句

始终选择表中所有记录的 WHERE 子句

SQL HELP - 基于 BIT 变量的条件 where 子句 - SQL Server

Redshift - 在 where 子句中从 csv 传递值

有一个 mySQL 错误,未知列 where 子句 [重复]

无法将提示中的多个值传递给 Bi Publisher 11g