【问题标题】:IS NULL is not working for certains data types but IS NOT NULL worksIS NULL 不适用于某些数据类型,但 IS NOT NULL 有效
【发布时间】:2017-08-17 19:04:10
【问题描述】:

我正在 SQL Server 2014 (v12.0.5203​​) 中运行查询,但我注意到以下结果,这里是我的查询:

SELECT TOP (1000) 
    [CustomerID], [NameStyle], [Title],
    [LastName], [Suffix], [CompanyName],
    [SalesPerson], [EmailAddress], [ModifiedDate]
FROM 
    [AdventureWorksLT2012].[SalesLT].[Customer]
WHERE 
    NameStyle = 0
    AND (([Suffix] IS NULL) 
         OR (MiddleName IS NOT NULL 
         AND ModifiedDate > '20030901'))

这样我只在[Suffix] IS NULL时得到结果,忽略了

OR
(MiddleName IS NOT NULL 
AND ModifiedDate > '20030901'

但是如果我改变了

[Suffix] IS NULL by [Suffix] IS NOT NULL

它按预期工作,显示了两个结果,我还使用

Suffix (varchar) 替换为 ModifiedDate (Datetime)
IS NULL AND IS NOT NULL,

它奏效了。我能够解决我的问题,分解查询,然后使用 UNION ALL 但不确定我是否在查询上做错了,或者 IS NULL 对于某些数据类型不能正常工作(不认为是) ,如果有人能解释为什么会发生这种情况,我将不胜感激。

谢谢

这两种方式都有效

【问题讨论】:

  • 应该返回但不返回的行的示例是什么?
  • 这是一个很好的起点。 spaghettidba.com/2015/04/24/…
  • 最可能的解释是您的数据不是您认为的那样。我向你保证 IS NULL 按预期工作,它适用于所有数据类型。
  • 我敢打赌 [Suffix] 是一个字符串,而你认为​​空字符串是一个空字符串,这实际上是完全不同的东西
  • 如果没有样本数据和预期结果,我认为任何人都无法帮助您,我们无法猜测您需要什么或发生了什么,也无法假设您想要OR 或@ 987654332@

标签: sql sql-server tsql sql-server-2014 isnull


【解决方案1】:

所以...

OR (MiddleName IS NOT NULL AND ModifiedDate > '20030901')

将中间名和修改日期过滤器组合在一起。如果大多数记录没有中间名(它为空),那么您将不会获得很多记录。

你的代码

(([Suffix] IS NULL) 
OR (MiddleName IS NOT NULL AND ModifiedDate > '20030901'))

正在返回没有后缀或具有中间名和修改日期范围的结果。

我想你想要

(([Suffix] IS NULL OR MiddleName IS NOT NULL) 
AND ModifiedDate > '20030901')

这将为您提供 2003-9-1 之后没有后缀或有中间名的所有内容。

【讨论】:

    猜你喜欢
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 2013-02-04
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多