我需要将表示地址行的三列组合成一列,以便在此处组成整个地址。所有三列都可以包含NULL值。 我想方法如下:
SELECT IIF((add1.AddressLine1 Is Null), '', add1.AddressLine1 + CHAR(13)) +
IIF((add1.AddressLine2 Is Null), '', add1.AddressLine2 + CHAR(13)) +
add1.AddressLine3 As EntireAddress
FROM T_Address add1
但是,“Is”的两个实例都有一个红色波浪形下划线,表示“Is'附近的语法不正确。”错误。我做错了什么/我怎样才能实现我的目标?我使用SSMS 2012.
感谢名单!
答案 0 :(得分:1)
IIF
(Transact-SQL)。问题是您正在尝试使用不存在的函数,而不是IS NULL
是一个问题。
IIF
是编写CASE
表达式的简便方法。它评估了 布尔表达式作为第一个参数传递,然后返回 基于结果的其他两个参数中的任何一个 评价。也就是说,如果布尔值,则返回true_value expression为true,如果是Boolean则返回false_value 表达是错误的或未知的。 true_value和false_value可以是 随便哪种。适用于布尔值CASE
表达式的相同规则 表达式,空值处理和返回类型也适用于IIF
。对于 更多信息,请参阅CASE
(Transact-SQL)。
因此,您可以这样做:
SELECT CASE WHEN add1.AddressLine1 IS NULL THEN '' ELSE add1.AddressLine1 + CHAR(13) END +
CASE WHEN add1.AddressLine2 IS NULL THEN '' ELSE add1.AddressLine2 + CHAR(13) END +
add1.AddressLine3 As EntireAddress --Note, if AddressLine3 has a value of NULL then NULL will be returned here
FROM T_Address add1;
但是,为什么不简单地使用COALESCE
或ISNULL
和NULLIF
?
SELECT NULLIF(ISNULL(add1.AddressLine1 + CHAR(13),'') +
ISNULL(add1.AddressLine2 + CHAR(13),'') +
ISNULL(AddressLine3,''),'') AS EntireAddress
FROM T_Address add1;
这更加简洁。
答案 1 :(得分:0)
这是一个通常尝试执行IIF(boolean checking for Null, yes_value, no_value)
的不错的解决方法(尽管Im不确定是否可以有条件地添加字符,例如+ CHAR(13)
,就像在OPs问题中一样)。我发现这是answer的一个检查空字符串的问题:
ISNULL(NULLIF(no_value, Null), yes_value)
no_value
是否为Null
Null
,则将其替换为yes_value
Null
,它将被返回