Sql 我应该使用IIF和ISNULL来选择默认值吗?
如果选择值为0或null,这是从表中选择默认值的最佳方法吗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 @
可能会有很多争论什么是最好的方法,什么不是,但是 对我来说,使用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。