我需要将代表地址线的三列组合成一列,以便在此处组成整个地址。所有三列都可以包含 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。
谢谢!
IIF
(Transact-SQL) 是在 SQL Server 2012 中引入的。问题是您尝试使用不存在的函数,而不是 IS NULL
是一个问题。
是编写IIF
表达式的简写方式。它评估 布尔表达式作为第一个参数传递,然后返回 其他两个参数中的任何一个都基于结果 评估。也就是说,如果布尔值则返回 true_value 表达式为 true,如果布尔值则返回 false_value 表达式错误或未知。 true_value 和 false_value 可以是 任何类型。适用于布尔值CASE
表达式的相同规则 表达式、空处理和返回类型也适用于CASE
。为了 有关详细信息,请参阅IIF
(Transact-SQL)。CASE
因此,您可以这样做:
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;
这更加简洁。
对于一般情况下尝试执行
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
将会被退回只是为了说明之前已经很好的答案, 有时我会检查 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
这给了我一个唯一和非唯一索引的列表,包括删除脚本: