当存在时的情况

时间:2016-10-10 11:33:54

标签: sql sql-server tsql case exists

如何正确编写:

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

感谢。

4 个答案:

答案 0 :(得分:0)

SQL中的where子句需要将某些内容与其他内容进行比较。看起来你只是想说'#34;带回一切,除非@p7_的值为1,在这种情况下检查记录是否存在于别处。"

您可以使用and子句中的orwhere等简单逻辑运算符来实现此目的:

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

答案 1 :(得分:0)

这可以通过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 

答案 2 :(得分:0)

我认为这就是你想要的:

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,但这很容易添加。

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

答案 3 :(得分:0)

一些侧面信息:

在T-Sql中,window.onclick = function (event) { if (!event.target.matches('.immune-nav-close')) { var dropdowns = document.getElementsByClassName("dropdown-content"); var i; for (i = 0; i < dropdowns.length; i++) { var openDropdown = dropdowns[i]; if (openDropdown.classList.contains('show')) { openDropdown.classList.remove('show'); } } $('.ddown-nav').collapse('hide') } } 是一个带有EXISTS结果的布尔表达式。然而,与许多其他语言不同,true/false&#34;值&#34;在T-Sql中,不要映射到整数值。换句话说,您永远不能将T-Sql 布尔表达式结果视为true/false值。它们只能用于bool子句,例如INTWHERE ...JOIN ON ...IF ...