组合 IIF 和 'Is Null' 时出错

问题描述 投票:0回答:3

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

谢谢!

sql-server syntax-error iif
3个回答
6
投票

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

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

对于一般情况下尝试执行

IIF(boolean checking for Null, yes_value, no_value)
来说,这是一个很好的解决方法(尽管我不确定它是否允许有条件地添加字符,例如
+ CHAR(13)
,如 OP 问题中所示)。我发现这是检查空字符串问题的答案

ISNULL(NULLIF(no_value, Null), yes_value)

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

0
投票

只是为了说明之前已经很好的答案, 有时我会检查 null 和其他东西, 正如您在下面的示例中看到的。

此脚本可为您提供

drop index including an unique index or primary key

检查IIF

select [@Command] = CASE WHEN i.is_unique_constraint = 1
                           OR i.is_primary_key = 1
                         THEN  'ALTER TABLE ' +  QUOTENAME(OBJECT_SCHEMA_NAME(t.object_id)) + '.' + QUOTENAME(OBJECT_NAME(t.object_id))  + ' drop constraint ' + QUOTENAME(i.name)
                         ELSE  'DROP INDEX '  +  QUOTENAME(i.name) + ' ON ' + QUOTENAME(OBJECT_SCHEMA_NAME(t.object_id)) + '.' + QUOTENAME(OBJECT_NAME(t.object_id)) 
                    END
                                             
       ,[@table_name] = OBJECT_SCHEMA_NAME(t.object_id) + '.' + OBJECT_NAME(t.object_id) 
       ,[Is this index Unique?]=IIF (i.is_unique IS NULL OR i.index_id = 0,NULL, CASE WHEN i.is_unique = 0 THEN 'No' ELSE 'Yes' END )
       ,[Index Description] =  CASE WHEN i.type_desc = 'HEAP' 
                                     THEN 'HEAP' 
                                     ELSE i.type_desc + 
                                            CASE WHEN i.is_unique_constraint = 1 THEN ', UNIQUE CONSTRAINT' ELSE '' END +
                                            CASE WHEN i.is_primary_key = 1       THEN ', PRIMARY KEY' ELSE '' END 
                                END 
       ,i.*
    from sys.tables t 
    inner join sys.indexes i
      on i.object_id = t.object_id  
    where 1=1
      --and t.name = @table_name 
      --and i.type=2 
      --and i.is_unique=1

ORDER BY OBJECT_SCHEMA_NAME(t.object_id) + '.' + OBJECT_NAME(t.object_id) ,I.is_unique

这给了我一个唯一和非唯一索引的列表,包括删除脚本:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.