SQL Server-使用SELECT CASE WHEN设置位变量,但如果SELECT未返回任何记录,则将其默认为0

SQL Server-使用SELECT CASE WHEN设置位变量,但如果SELECT未返回任何记录,则将其默认为0,sql,sql-server,Sql,Sql Server,我目前正在使用以下语句。我怎样才能只用一句话就完成这个逻辑呢 DECLARE @DisableCSDSync BIT SET @DisableCSDSync = (SELECT CASE WHEN PropertyValue = 'true' THEN 1 ELSE 0

我目前正在使用以下语句。我怎样才能只用一句话就完成这个逻辑呢

DECLARE @DisableCSDSync BIT

SET @DisableCSDSync = (SELECT 
                           CASE WHEN PropertyValue = 'true' 
                              THEN 1 
                              ELSE 0 
                           END 
                       FROM MyTable WITH (NOLOCK) 
                       WHERE Property = 'DisableSync' AND ParentId = 61040)

IF @DisableCSDSync IS NULL 
    SET @DisableCSDSync = 0

您可以在声明变量时设置默认值,以便在select查询没有提取行的情况下,该变量将具有默认值。另外,在select语句中设置该值,以防止在没有要提取的行时该值变为null,如下所示:

DECLARE @DisableCSDSync BIT = 0

SELECT @DisableCSDSync = CASE WHEN PropertyValue = 'true' THEN 1 ELSE 0 END FROM MyTable WITH (NOLOCK) WHERE Property = 'DisableSync' AND ParentId = 61040

您可以在声明变量时设置默认值,以便在select查询没有提取行的情况下,该变量将具有默认值。另外,在select语句中设置该值,以防止在没有要提取的行时该值变为null,如下所示:

DECLARE @DisableCSDSync BIT = 0

SELECT @DisableCSDSync = CASE WHEN PropertyValue = 'true' THEN 1 ELSE 0 END FROM MyTable WITH (NOLOCK) WHERE Property = 'DisableSync' AND ParentId = 61040

即使select不返回任何记录,此查询也将为您提供预期的输出

DECLARE @DisableCSDSync BIT

SET @DisableCSDSync = ISNULL((SELECT CASE
                                       WHEN PropertyValue = 'true' THEN 1
                                       ELSE 0
                                     END
                              FROM   MyTable WITH (NOLOCK)
                              WHERE  Property = 'DisableSync'
                                     AND ParentId = 61040), 0) 

即使select不返回任何记录,此查询也将为您提供预期的输出

DECLARE @DisableCSDSync BIT

SET @DisableCSDSync = ISNULL((SELECT CASE
                                       WHEN PropertyValue = 'true' THEN 1
                                       ELSE 0
                                     END
                              FROM   MyTable WITH (NOLOCK)
                              WHERE  Property = 'DisableSync'
                                     AND ParentId = 61040), 0) 

您还可以使用以下命令

DECLARE @DisableCSDSync BIT = ISNULL(TRY_CAST((
                   SELECT PropertyValue
                   FROM   MyTable WITH (NOLOCK)
                   WHERE  Property = 'DisableSync'
                          AND ParentId = 61040) AS BIT), 0);
它使用与其他答案之一相同的ISNULL方法来处理零行情况,但也使用相同的ISNULL与TRY_CAST结合使用。。作为处理本案其他分支的一部分


语义并不完全相同,如果PropertyValue为1,则使用上述方法将其视为true,但它们可能足够接近

DECLARE @DisableCSDSync BIT = ISNULL(TRY_CAST((
                   SELECT PropertyValue
                   FROM   MyTable WITH (NOLOCK)
                   WHERE  Property = 'DisableSync'
                          AND ParentId = 61040) AS BIT), 0);
它使用与其他答案之一相同的ISNULL方法来处理零行情况,但也使用相同的ISNULL与TRY_CAST结合使用。。作为处理本案其他分支的一部分


语义不完全相同,如果PropertyValue为1,则使用上述方法将其视为true,但它们可能足够接近。

DECLARE@DisableCSDSync BIT

设置@DisableCSDSync=isnull 选择PropertyValue为'true'时的最大大小写,然后选择1或0结束 从我和诺洛克的桌子上 其中属性='DisableSync' 和ParentId=61040 ,0

当您没有收到任何记录时,Isnull将授予默认值0。
最大值将确保您只收到1条记录。多个记录将给你一个错误

声明@DisableCSDSync位

设置@DisableCSDSync=isnull 选择PropertyValue为'true'时的最大大小写,然后选择1或0结束 从我和诺洛克的桌子上 其中属性='DisableSync' 和ParentId=61040 ,0

当您没有收到任何记录时,Isnull将授予默认值0。
最大值将确保您只收到1条记录。多个记录将给你一个错误

PropertyValue的数据类型是什么?PropertyValue的数据类型是什么?我喜欢这个答案,但这也可以通过COALESCE实现吗?我喜欢这个答案,但也可以通过COALESCE实现吗?