带有 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
子句中使用简单的逻辑运算符(例如and
和or
)来实现这一点:
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 行为