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

前端之家收集整理的这篇文章主要介绍了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

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

猜你在找的MsSQL相关文章