我应该使用IIF和ISNULL来选择默认值吗?

时间:2015-03-10 12:10:18

标签: sql sql-server

如果选择值为0null,这是从表中选择默认值的最佳方法吗?

DECLARE @value INT = 15 
DECLARE @defaultValue INT = 12

SELECT IIF(ISNULL(@value,0) = 0, @defaultValue, @value)

4 个答案:

答案 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的事实也对其他人有影响   这个函数的行为方面......

但同样适用于ISNULLSQL-Server也是COALECSE函数,可以由ISNULL替换。

顺便说一下,如果在COALESCE - 子句中使用WHERESELECT ... 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是   ISNULLCOALESCE不同。 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)