如果选择值为0
或null
,这是从表中选择默认值的最佳方法吗?
DECLARE @value INT = 15
DECLARE @defaultValue INT = 12
SELECT IIF(ISNULL(@value,0) = 0, @defaultValue, @value)
答案 0 :(得分:3)
指定“最佳”。由于IIF
仅适用于SQL-Server,因此我使用的是CASE
,这是ANSI SQL标准,适用于每个(?)rdbms:
SELECT CASE WHEN ISNULL(@value,0) = 0 THEN @defaultValue ELSE @value END
实际上,IIF
甚至已翻译为CASE
:
IIF是编写CASE表达式的简便方法...... IIF被翻译成CASE的事实也对其他人有影响 这个函数的行为方面......
但同样适用于ISNULL
,SQL-Server
也是COALECSE
函数,可以由ISNULL
替换。
顺便说一下,如果在COALESCE
- 子句中使用WHERE
或SELECT ...
FROM dbo.TableName
WHERE @value IS NOT NULL AND @value <> @value
,则会阻止查询优化器使用索引。那么你应该更喜欢:
ISNULL
但是,我更喜欢COALESCE
而不是ISNULL
,因为后者如果包含子查询则会出现问题。它执行两次,而COALESCE
执行一次。实际上CASE
也被翻译为{{1}}。您可以阅读该问题here。
答案 1 :(得分:3)
您可以使用COALESCE。它按顺序计算参数,并返回最初未评估为NULL
的第一个表达式的当前值。它用于获取第一个not null
值。
SELECT COALESCE(@value,@defaultValue)
但请记住,
如果所有参数都为NULL,则COALESCE返回NULL。至少有一个 空值必须是类型化的NULL。
您也可以使用ISNULL
,但两者之间存在差异,如下所示,
比较COALESCE和ISNULL
1)
ISNULL
函数和COALESCE
表达式具有相似之处 目的但可以表现不同。因为ISNULL
是一个函数,它 仅评估一次。如上所述,输入值为COALESCE
表达式可以多次评估 2)数据类型 确定结果表达式是不同的。ISNULL
使用 第一个参数COALESCE
的数据类型跟在CASE
之后 表达式规则并返回具有最高值的数据类型 优先。
3)结果表达式的NULLability
是ISNULL
和COALESCE
不同。ISNULL
返回值为。{1} 始终考虑NOT NULLable (assuming the return value is a non-nullable one)
,而COALESCE
使用非null参数 被认为是NULL
。所以表达式ISNULL(NULL, 1)
和COALESCE(NULL, 1)
虽然相当于nullability
值。如果你在使用这些表达式,这会有所不同 计算列,创建键约束或返回值 标量UDF确定性的,以便可以如下所示进行索引 以下示例。
如果您打算在表达式中使用子查询来检查NULL
,那么您最好使用ISNULL
作为COALESCE
将多次评估相同的查询。
答案 2 :(得分:0)
可能有很多论据是什么是最好的方式,什么不是,但是
对我来说,使用case
语法时可读性稍高一些:
select case when @value is null then @defaultValue else @value end
答案 3 :(得分:0)
您可以使用CASE
声明。
SELECT CASE WHEN @value IS NULL THEN @defaultValue ELSE @value END
或COALESCE
表达
SELECT COALESCE(@value,@defaultValue)