【问题标题】:Error when combining IIF and 'Is Null'组合 IIF 和“Is Null”时出错
【发布时间】:2018-04-24 08:41:09
【问题描述】:

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

谢谢!

【问题讨论】:

  • 我无法复制这个问题; DECLARE @a int; SELECT IIF(@a IS NULL,1,0); 工作正常。
  • 您的Sql Server 版本是什么?
  • @Larnu,这对我不起作用。 A. 我需要将@a IS NULL 放在括号中,否则我会得到“IIF 函数需要 3 个参数”。 B. 应用括号时,我又回到了最初的错误。
  • @Abhishek 我使用 SQL Server 管理系统 2012
  • @Cooz SSMS 不是 SQL 版本,它是一个应用程序。您使用的是什么版本的 SQL Server? (你的回答类似于问某人“你有什么版本的 Windows?”,他们回答说“我正在使用 Microsoft Office 2016。”)。

标签: sql-server syntax-error iif


【解决方案1】:

IIF (Transact-SQL) 是在 SQL Server 2012 中引入的。问题是您尝试使用不存在的函数,而不是 IS NULL 是一个问题。

IIF 是编写CASE 表达式的简写方式。它评估了 布尔表达式作为第一个参数传递,然后返回 基于结果的其他两个参数中的任何一个 评估。也就是说,如果布尔值返回 true_value 表达式为真,如果布尔值返回 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;

这更简洁。

【讨论】:

  • 是的,谢谢@Larnu。 db 现在安装在 SQL Server 2012 上,您的建议在这里都可以正常工作。非常感谢!
【解决方案2】:

这是尝试做IIF(boolean checking for Null, yes_value, no_value)的一个很好的解决方法(尽管我不确定它是否允许有条件地添加字符,例如+ CHAR(13),就像在OPs问题中一样)。我发现这是一个answer 来检查空字符串的问题:

ISNULL(NULLIF(no_value, Null), yes_value)

  • no_value 将被检查是否为Null
  • 如果是Null,则替换为yes_value
  • 如果不是Null会被退回

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 2015-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多