如何使用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)
| 归档时间: |
|
| 查看次数: |
1692 次 |
| 最近记录: |