组合IIF和'Is Null'时出错

时间:2018-04-24 08:41:10

标签: sql-server syntax-error iif

我需要将表示地址行的三列组合成一列,以便在此处组成整个地址。所有三列都可以包含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.

感谢名单!

2 个答案:

答案 0 :(得分:1)

SQL Server 2012中引入了

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;

但是,为什么不简单地使用COALESCEISNULLNULLIF

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,它将被返回