SQL查询WHERE子句匹配空日期异常:返回1900-01-01而非空值
为什么查询
DateOfBirth = ''返回1900-01-01而非NULL记录? 我执行以下查询试图找出DateOfBirth为空的记录,但返回结果不符合预期:
SELECT TOP 5 DateOfBirth, * FROM [MyDataBase].[dbo].[CustomerRecord] WHERE DateOfBirth = ''
返回的是DateOfBirth为1900-01-01的行:
| ID | DateOfBirth | Surname |
|---|---|---|
| 1 | 1900-01-01 | Jones |
| 2 | 1900-01-01 | Deacon |
| 6 | 1900-01-01 | Bacon |
| 10 | 1900-01-01 | James |
| 12 | 1900-01-01 | Burns |
通过INFORMATION_SCHEMA.COLUMNS查看列定义:DateOfBirth是date类型,COLUMN_DEFAULT为NULL,IS_NULLABLE设置为YES。为什么查询没有返回DateOfBirth为NULL的行?
问题根源
在SQL Server中,当你将空字符串''与date类型的列进行比较时,会触发隐式类型转换:空字符串会被自动转换为date类型的默认起始值1900-01-01。这意味着你的查询WHERE DateOfBirth = ''实际上等价于WHERE DateOfBirth = '1900-01-01',自然只会返回该日期的行,而非NULL值。
另外,NULL值的判断逻辑特殊:NULL不等于任何值(包括它自己),所以用= NULL或者= ''都无法匹配到NULL的行。
正确的查询语句
要筛选出DateOfBirth为NULL的记录,必须使用IS NULL关键字:
SELECT TOP 5 DateOfBirth, * FROM [MyDataBase].[dbo].[CustomerRecord] WHERE DateOfBirth IS NULL
内容的提问来源于stack exchange,提问作者Northernlad
相关产品推荐
相关产品推荐

