带有 Exists 的 WHERE CASE WHEN THEN 语句

Posted

技术标签:

【中文标题】带有 Exists 的 WHERE CASE WHEN THEN 语句【英文标题】:WHERE CASE WHEN THEN statement with Exists 【发布时间】:2016-10-10 11:33:54 【问题描述】:

如何正确书写:

declare @p7_ int
set @p7_=1
select * from cdn.tranag
    where  
    case when @p7_=1 then 
    exists(select * from cdn.zrodla join cdn.dziennik on dzk_gidnumer=zro_dtnumer where TrN_GIDTyp=zro_trntyp and TrN_GIDNumer=zro_trnnumer) 
    else -1 end

谢谢。

【问题讨论】:

添加一些示例表数据,以及预期的结果。 (以及格式化的文本。)并标记您正在使用的 dbms。 你想达到什么目的? 如果参数 = 1 则存在。如果参数 = 0 则显示全部 【参考方案1】:

SQL 中的where 子句需要将某些内容与其他内容进行比较。看起来您只是想说“带回所有内容,除非 @p7_ 的值为 1,在这种情况下检查记录是否存在于其他地方。”

您可以在where 子句中使用简单的逻辑运算符(例如andor)来实现这一点:

select columns
from table
where @p7_ <> 1
   or (@p7_ = 1
       and exists(<exists statement>)
      )

【讨论】:

【参考方案2】:

这可以通过AND/OR逻辑来实现。

你正在寻找这个

SELECT *
FROM   cdn.Tranag
WHERE  ( @p7_ = 1
         AND EXISTS(SELECT *
                    FROM   cdn.zrodla
                           JOIN cdn.dziennik
                             ON dzk_gidnumer = zro_dtnumer
                    WHERE  TrN_GIDTyp = zro_trntyp
                           AND TrN_GIDNumer = zro_trnnumer) )
        OR @p7_ = 0 

【讨论】:

【参考方案3】:

我想这就是你想要的:

select *
from cdn.tranag t
where (@p7_= 1 and
       exists (select 1
               from cdn.zrodla join
                    cdn.dziennik
                    on dzk_gidnumer = zro_dtnumer
               where t.TrN_GIDTyp = zro_trntyp and
                     t.TrN_GIDNumer = zro_trnnumer
              )
      ) or
      (@p7_ <> 1);

这实现了如果@p7_ = 1 则检查exists 子句的逻辑。否则,将选择所有行。注意:这不会检查NULL,但很容易添加。

另外,请注意表别名的使用。您应该始终使用表别名,尤其是当您使用子查询时,尤其是当您有多个表时。

【讨论】:

【参考方案4】:

补充一点信息:

在 T-Sql 中,EXISTS 是一个布尔表达式,其结果为 true/false。然而,与许多其他语言不同,T-Sql 中的true/false“值”不映射到整数值。换句话说,您永远不能将 T-Sql 布尔表达式结果 视为 INT 值。它们只能用于WHERE ...JOIN ON ...IF ...CASE WHEN ... 等布尔子句中。

【讨论】:

以上是关于带有 Exists 的 WHERE CASE WHEN THEN 语句的主要内容,如果未能解决你的问题,请参考以下文章

带有 WHERE EXISTS 的 SQL UPDATE 语句

带有“where exists”的“Set”比没有的效果更好

带有 INSERT 和 WHERE NOT EXISTS 的奇怪 SQL 行为

SQL 中 EXISTS 与 NOT EXISTS

Oracle where exists 子句不适用于 SQL Plus

没有值时带有 CASE 的 SQL 语句