使用合并检查所有变量是否为空

JJS*_*JJS 5 sql-server t-sql

如何使用coalesce 检查所有具有不同类型优先级的变量是否全部为NULL 而不会遇到错误。

DECLARE 
@StartDate DATETIME = NULL,
@EndDate DATETIME = NULL,
@StateCode CHAR(2) = NULL,
@CountyCode CHAR(3) = NULL,
@ProducerName VARCHAR(64) = null,
@TaxID VARCHAR(9) = null,
@Farm INT = null

SELECT CASE WHEN COALESCE(
    @StartDate, 
    @EndDate, 
    @StateCode, 
    @CountyCode, 
    @ProducerName, 
    @TaxID, 
    @Farm) IS NULL 
THEN 'yes' ELSE 'no' END
Run Code Online (Sandbox Code Playgroud)

输出:'是'

添加SELECT @StateCode = '22'会出现此错误

Msg 241, Level 16, State 1, Line 94
Conversion failed when converting date and/or time from character string.
Run Code Online (Sandbox Code Playgroud)

这是有效的

SELECT CASE WHEN 
   COALESCE(@StartDate, @EndDate) IS NULL 
   AND COALESCE(@StateCode, @CountyCode, @ProducerName, @TaxID) IS NULL 
   AND @farm IS NULL 
THEN 'yes' ELSE 'no' END
Run Code Online (Sandbox Code Playgroud)

我很想知道是否有另一种聪明的方法来以简洁的方式实现这一点,这样我就不必记住按类型族分开。

Mar*_*ith 11

只要涉及的所有变量的数据类型都兼容sql_variant(在这种情况下它们是 - 基本上没有 LOB 数据类型、CLR 类型或用户定义的数据类型),那么您就可以使用

SELECT CASE WHEN COALESCE(
    CAST(@StartDate as sql_variant), 
    @EndDate, 
    @StateCode, 
    @CountyCode, 
    @ProducerName, 
    @TaxID, 
    @Farm) IS NULL 
THEN 'yes' ELSE 'no' END
Run Code Online (Sandbox Code Playgroud)

只需将其中一个参数转换为 COALESCE

返回具有最高数据类型优先级的表达式的数据类型。

并且sql_variant具有非常高的数据类型优先级(只会被用户定义的数据类型打败,无论如何它们都会阻止该方法工作)。

就我个人而言,我认为这比找到单个IS NULL结果的结合更容易理解。


ype*_*eᵀᴹ 10

我发现简单的语法更易读,更不容易混淆。当您可以检查所有变量(一个一个)是否为NULL?时,为什么要使用函数(可以抛出这些奇怪的错误):

CASE WHEN (@a IS NULL AND @b iS NULL .... AND @x iS NULL)
         THEN 'yes'
         ELSE 'no'
END
Run Code Online (Sandbox Code Playgroud)

替代条件 - 尽管在我看来可读性较差:

CASE WHEN NOT EXISTS 
          ( SELECT @a, @b, @c, @d, @e
            EXCEPT
            SELECT NULL, NULL, NULL, NULL, NULL
          ) 
         THEN 'yes'
         ELSE 'no'
END
Run Code Online (Sandbox Code Playgroud)

CASE WHEN EXISTS 
          ( SELECT @a, @b, @c, @d, @e
            INTERSECT
            SELECT NULL, NULL, NULL, NULL, NULL
          ) 
         THEN 'yes'
         ELSE 'no'
END
Run Code Online (Sandbox Code Playgroud)

最后两个选项看起来类似于另一个(标准 SQL 但尚未在 SQL Server 中实现)选项:

CASE WHEN (@a, @b, @c, @d, @e)
          IS NOT DISTINCT FROM
          (NULL, NULL, NULL, NULL, NULL) 
         THEN 'yes'
         ELSE 'no'
END
Run Code Online (Sandbox Code Playgroud)