微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

sql-server – 为什么0等于空字符串?

我需要一些帮助来找到为什么以下T-sql语句返回1(true):
SELECT IIF( 0 = '',1,0)

我猜有人改变了ANSI选项,例如SET ANSI_NULLS或导致该行为的其他东西.

我的问题是我正在加入一些值,在最后一行中我有值由0和”值连接,这是不正确的.

解决方法

这只是记录在案的行为.我认为没有人搞砸这些设置.

请参阅MSDN上的data type precedence.

When an operator combines two expressions of different data types,the
rules for data type precedence specify that the data type with the
lower precedence is converted to the data type with the higher
precedence.

如注释中所述,空字符串在任何数字类型中转换为0,在转换为日期时转换为1900-01-01 00:00:00.000.

编辑:我认为您的真正问题是您的设计是必须加入不同数据类型的字段.解决这个问题的唯一方法是对join子句进行转换,这会损害查询性能.主要问题可能在于架构设计

编辑:
评论中有很多讨论已经转移到聊天中.但是看起来不合逻辑,将空字符串转换为其他数据类型会产生任意值.

这段代码

SELECT CONVERT(int,'')
SELECT CONVERT(float,'')
SELECT CONVERT(date,'')
SELECT CONVERT(datetime,'')

生成输出

0
0
1900-01-01
1900-01-01 00:00:00.000

那么你可以期望这种行为在其他前面的数据类型之间是一致的,并且期望将0转换为日期会产生相同的任意值,但事实并非如此.

SELECT CONVERT(date,0)

产生

Explicit conversion from data type int to date is not allowed.

因为它不是supported conversion

SELECT CONVERT(datetime,0)

返回

January,01 1900 00:00:00

所以,是的,这是奇怪和随意的,但实际上是记录和解释的.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐