为什么 0 等于空字符串?

got*_*tqn 24 sql-server t-sql sql-server-2012

我需要一些帮助来找出以下T-SQL语句返回的原因1(true):

SELECT IIF( 0 = '', 1, 0)
Run Code Online (Sandbox Code Playgroud)

我猜有人改变了一个ANSI选项,比如SET ANSI_NULLS导致这种行为的其他东西。

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

Tom*_*m V 33

那只是记录在案的行为。我认为没有人弄乱了设置。

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

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

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

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

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

这段代码:

SELECT CONVERT(int, '')
SELECT CONVERT(float, '')
SELECT CONVERT(date, '')
SELECT CONVERT(datetime, '')
Run Code Online (Sandbox Code Playgroud)

产生这个输出:

0
0
1900-01-01
1900-01-01 00:00:00.000
Run Code Online (Sandbox Code Playgroud)

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

SELECT CONVERT(date, 0)
Run Code Online (Sandbox Code Playgroud)

生产

不允许从数据类型 int 显式转换为 date。

因为它不是受支持的转换

尽管

SELECT CONVERT(datetime, 0)
Run Code Online (Sandbox Code Playgroud)

退货

1900 年 1 月 1 日 00:00:00

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

  • 行为`CAST('' AS INT)` -> 0 是否记录在某处?如果添加引用就好了。 (2认同)
  • @SalmanA:它*应该*记录在[char/varchar文档](https://docs.microsoft.com/en-us/sql/t-sql/data-types/)的“转换字符数据”部分char-and-varchar-transact-sql?view=sql-server-ver15),但目前不是。我已经留下了反馈意见,要求将其包括在内。 (2认同)