【问题标题】:select data by passing a value in where clause if the value match then return that data otherwise return all data通过在 where 子句中传递值来选择数据,如果值匹配则返回该数据,否则返回所有数据
【发布时间】: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

标签: sql oracle


【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-02
      相关资源
      最近更新 更多