I need some help in finding why the following T-SQL
statement returns 1
(true):
SELECT IIF( 0 = '', 1, 0)
I guess someone has change an ANSI
option like SET ANSI_NULLS
or something else that is causing the behavior.
My issue is that I am joining some values and in the final row set I have values which are joined by 0
and ''
values, which is not correct.
1 Answer 1
That is just documented behavior. I don't think anyone messed with the settings.
See data type precedence on MSDN.
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.
As noted in the comments the empty string gets converted to 0 in any numeric type and to 1900年01月01日 00:00:00.000 when converted to a date.
EDIT: I think your real problem is that your design is so that you have to join on fields of a different data type. The only way to get around this is to have a convert on your join clause which will hurt query performance. The main problem is probably with the schema design
EDIT: There was a lot of discussion in the comments that have been moved to chat. However illogical it may seem, converting an empty string to other data types produces arbitrary values.
This code:
SELECT CONVERT(int, '')
SELECT CONVERT(float, '')
SELECT CONVERT(date, '')
SELECT CONVERT(datetime, '')
Produces this output:
0
0
1900年01月01日
1900年01月01日 00:00:00.000
You could expect then that this behavior is consistent between other preceding datatypes and expect that converting 0 to a date would produce the same arbitrary value but it doesn't.
SELECT CONVERT(date, 0)
Produces
Explicit conversion from data type int to date is not allowed.
Because it's not a supported conversion
while
SELECT CONVERT(datetime, 0)
Returns
January, 01 1900 00:00:00
So yes, it's weird and arbitrary, but actually documented and explainable.
-
Comments are not for extended discussion; the conversation about this answer has been moved to chat.2015年10月10日 04:53:27 +00:00Commented Oct 10, 2015 at 4:53
-
2Is the behavior
CAST('' AS INT)
-> 0 documented somewhere? It would be nice if you add reference.Salman Arshad– Salman Arshad2017年12月19日 10:11:23 +00:00Commented Dec 19, 2017 at 10:11 -
2@SalmanA: It should be documented in the "Converting Character Data" section of the char/varchar documentation, but it currently isn't. I have left a feedback comment asking for it to be included.Heinzi– Heinzi2019年10月29日 09:06:08 +00:00Commented Oct 29, 2019 at 9:06
-
Are there any performance loss to mention if one just uses
myIntColumn =''
in sted of checking the datatype first and askingmyIntColumn =0
inside a where statement?Håkon Seljåsen– Håkon Seljåsen2023年11月24日 11:08:03 +00:00Commented Nov 24, 2023 at 11:08
0
and empty strings:SELECT LENGTH(0); -- returns 1. // SELECT LENGTH(''); -- returns 0;