为什么0等于空字符串?


23

我需要一些帮助来查找为什么以下T-SQL语句返回1(true):

SELECT IIF( 0 = '', 1, 0)

我猜有人更改了ANSI选项SET ANSI_NULLS或其他导致行为的选项。

我的问题是我要加入一些值,而在最后一行中,我有由0''值相连的值,这是不正确的。

Answers:


31

那只是记录的行为。我认为没有人搞砸这些设置。

请参阅MSDN上的数据类型优先级

当运算符组合两个不同数据类型的表达式时,数据类型优先级规则将指定优先级较低的数据类型转换为优先级较高的数据类型。

如注释中所述,空字符串在转换为日期时将转换为任何数字类型的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)

产生

不允许从数据类型int到日期的显式转换。

因为这不是受支持的转换

SELECT CONVERT(datetime, 0)

退货

1900年1月1日00:00:00

是的,这很奇怪而且很随意,但是实际上是有据可查的并且可以解释。


评论不作进一步讨论;关于这个答案的对话已转移到聊天中
保罗·怀特说GoFundMonica

2
行为CAST('' AS INT)-> 0是否记录在某处?如果添加引用,那将是很好。
Salman A

2
@SalmanA:应该将其记录在char / varchar文档的“转换字符数据”部分中,但目前没有。我已留下反馈意见,要求将其包括在内。
亨氏
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.