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

Sql 我应该使用IIF和ISNULL来选择默认值吗?,sql,sql-server,Sql,Sql Server,如果选择值为0或null,这是从表中选择默认值的最佳方法吗 可能会有很多争论什么是最好的方法,什么不是,但是 对我来说,使用case语法时可读性稍高一些: 可能会有很多争论什么是最好的方法,什么不是,但是 对我来说,使用case语法时可读性稍高一些: 指定最佳。由于IIF仅在SQL Server中工作,我将使用ANSI SQL标准的用例,该用例适用于所有rdbms: SELECT CASE WHEN ISNULL(@value,0) = 0 THEN @defaultValue ELSE @

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


可能会有很多争论什么是最好的方法,什么不是,但是 对我来说,使用case语法时可读性稍高一些:


可能会有很多争论什么是最好的方法,什么不是,但是 对我来说,使用case语法时可读性稍高一些:

指定最佳。由于IIF仅在SQL Server中工作,我将使用ANSI SQL标准的用例,该用例适用于所有rdbms:

SELECT  CASE WHEN ISNULL(@value,0) = 0 THEN  @defaultValue ELSE @value END
事实上,这甚至可以转化为案例:

IIF是写案例表达式的简写方式。。。 IIF转化为案例的事实也会对其他方面产生影响 此函数行为的各个方面

但是ISNULL也是如此,它也是一个SQL Server函数,可以被COALECSE替换

顺便说一下,如果在WHERE子句中使用ISNULL或COALESCE,则会阻止查询优化器使用索引。因此,您应该更喜欢:

SELECT  ...
FROM dbo.TableName
WHERE @value IS NOT NULL AND @value <> @value  
但是,我更喜欢ISNULL而不是COALESCE,因为后者在包含子查询时会有问题。它执行两次,而ISNULL执行一次。实际上,合并也被转化为CASE。您可以阅读该问题。

指定最佳。由于IIF仅在SQL Server中工作,我将使用ANSI SQL标准的用例,该用例适用于所有rdbms:

SELECT  CASE WHEN ISNULL(@value,0) = 0 THEN  @defaultValue ELSE @value END
事实上,这甚至可以转化为案例:

IIF是写案例表达式的简写方式。。。 IIF转化为案例的事实也会对其他方面产生影响 此函数行为的各个方面

但是ISNULL也是如此,它也是一个SQL Server函数,可以被COALECSE替换

顺便说一下,如果在WHERE子句中使用ISNULL或COALESCE,则会阻止查询优化器使用索引。因此,您应该更喜欢:

SELECT  ...
FROM dbo.TableName
WHERE @value IS NOT NULL AND @value <> @value  
但是,我更喜欢ISNULL而不是COALESCE,因为后者在包含子查询时会有问题。它执行两次,而ISNULL执行一次。实际上,合并也被转化为CASE。您可以阅读有关该问题的内容。

您可以使用CASE语句

SELECT CASE WHEN @value IS NULL THEN @defaultValue ELSE @value END
或联合表达

SELECT COALESCE(@value,@defaultValue)
您可以使用CASE语句

SELECT CASE WHEN @value IS NULL THEN @defaultValue ELSE @value END
或联合表达

SELECT COALESCE(@value,@defaultValue)
您可以使用。它按顺序计算参数,并返回最初未计算为NULL的第一个表达式的当前值。它用于获取第一个非空值

但请记住

如果所有参数都为NULL,则COALESCE返回NULL。至少有一个 null值必须是类型化的null

您也可以使用ISNULL,但它们之间的区别如下所示

比较COALESCE和ISNULL

1 ISNULL函数和COALESCE表达式具有类似的 但是可以有不同的表现。因为ISNULL是一个函数,所以 仅评估一次。如上所述,输入值为 合并表达式可以多次求值。 2数据类型 结果表达式的确定是不同的。ISNULL使用 第一个参数COALESCE的数据类型如下 表达式规则并返回具有最大值的值的数据类型 优先 3结果表达式的可空性为 ISNULL和COALESCE不同。ISNULL返回值为 假设返回值是不可为null的,则始终认为不可为null,而使用非null参数进行合并则是不可为null的 被认为是无效的。所以表达式为NullNull,1和 COALESCENULL,1尽管等效项具有不同的Null性 价值观如果在中使用这些表达式,则会产生差异 计算列,创建键约束或生成返回值 标量UDF的定义,以便可以对其进行索引,如中所示 下面是一个例子

如果您计划使用表达式中的子查询来检查NULL,那么最好使用ISNULL作为COALESCE,将多次计算同一查询

您可以使用。它按顺序计算参数,并返回最初未计算为NULL的第一个表达式的当前值。它用于获取第一个非空值

但请记住

如果所有参数都为NULL,则COALESCE返回NULL。至少有一个 null值必须是类型化的null

您也可以使用ISNULL,但它们之间的区别如下所示

比较COALESCE和ISNULL

1 ISNULL函数和COALESCE表达式具有类似的 但是可以有不同的表现。因为ISNULL是一个函数,所以 仅评估一次。如上所述,输入值为 合并表达式可以多次求值。 2数据类型 结果表达式的确定是不同的。ISNULL使用 第一个参数COALESCE的数据类型如下 表达规则与检索 ns值的数据类型,具有最高的 优先 3结果表达式的可空性为 ISNULL和COALESCE不同。ISNULL返回值为 假设返回值是不可为null的,则始终认为不可为null,而使用非null参数进行合并则是不可为null的 被认为是无效的。所以表达式为NullNull,1和 COALESCENULL,1尽管等效项具有不同的Null性 价值观如果在中使用这些表达式,则会产生差异 计算列,创建键约束或生成返回值 标量UDF的定义,以便可以对其进行索引,如中所示 下面是一个例子


如果您计划使用表达式中的子查询来检查NULL,那么最好使用ISNULL作为COALESCE,将多次计算同一查询

但是ISNULL也是特定于SQL Server的。@davidaber:我已经编辑了我的答案。但是,我更喜欢ISNULL而不是COALESCE,因为后者在包含子查询时会有问题。它执行两次,而ISNULL执行一次。实际上,合并也被转化为CASE。但是ISNULL也是特定于SQL Server的。@davidaber:我已经编辑了我的答案。但是,我更喜欢ISNULL而不是COALESCE,因为后者在包含子查询时会有问题。它执行两次,而ISNULL执行一次。实际上,合并也被转化为CASE。值得一提的是,COALESCE被翻译成CASE。值得一提的是COALESCE被翻译成CASE。