CASE WHEN SQL 查询在 else 中执行条件,即使第一个条件为真

Posted

技术标签:

【中文标题】CASE WHEN SQL 查询在 else 中执行条件,即使第一个条件为真【英文标题】:CASE WHEN SQL Query executes condition in else even if first condition is true 【发布时间】:2020-12-22 10:34:31 【问题描述】:

我正在尝试检查表中是否存在数据。首先我检查表是否存在,然后我使用 SELECT 语句检查表是否为空

DECLARE @dataExists BIT = 0

SELECT 
             @dataExists = CASE 
                               WHEN OBJECT_ID('TableName') IS NULL 
                                  THEN 0 
                                  ELSE CASE 
                                          WHEN EXISTS(SELECT 1 FROM TableName) 
                                             THEN 1 
                                             ELSE 0 
                                       END 
                            END

SELECT @dataExists

如果 OBJECT_ID('TableName') 返回 NULL,我有这个不应该执行的查询 SELECT 1 FROM TableName 但这个查询继续并执行

SELECT 1 FROM TableName 

这当然会引发错误

无效的对象名称表名

【问题讨论】:

基本上是dba.stackexchange.com/questions/43352/…的重复 【参考方案1】:

尝试以下方法:

DECLARE @dataExists BIT = 0

IF OBJECT_ID('TableName') IS NOT NULL
BEGIN
    SET @dataExists = (SELECT TOP 1 1 FROM TableName)
END

SELECT @dataExists

您遇到的错误是编译错误。因为它是一个单一的声明。 SQL Server 需要构建执行计划,如果表不存在,则不能这样做。

通过添加IF,如果不满足条件,则不需要“编译”语句。

使用动态 SQL:

DECLARE @TableName SysName = 'TableName'
DECLARE @Sql NVARCHAR(MAX) = '
DECLARE @dataExists BIT = 0

IF OBJECT_ID('''+@TableName+''') IS NOT NULL
BEGIN
    SET @dataExists = (SELECT TOP 1 1 FROM '+QUOTENAME(@TableName)+')
END

SELECT @dataExists
'

EXEC (@Sql)

【讨论】:

有没有办法使用动态SQL实现以上目标? 当然可以,但是为什么非动态 SQL 不够用呢?您是否需要使用动态 SQL?如果是这样,应该从一开始就提到这一点。 我怎样才能追加'??

以上是关于CASE WHEN SQL 查询在 else 中执行条件,即使第一个条件为真的主要内容,如果未能解决你的问题,请参考以下文章

SQL学习- case when then else

SQL学习- case when then else

SQL学习- case when then else

SQL学习- case when then else

mysql 查询某个字段并拼接case when出来的字段

case when用法sql