加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

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

发布时间:2020-12-31 15:28:30 所属栏目:编程 来源:网络整理
导读:我需要一些帮助来找到为什么以下T-SQL语句返回1(true): SELECT IIF( 0 = '',1,0) 我猜有人改变了ANSI选项,例如SET ANSI_NULLS或导致该行为的其他东西. 我的问题是我正在加入一些值,在最后一行中我有值由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

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

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读