sql - SQL Server 中的不等于逻辑问题

标签 sql logical-operators

我不敢相信我在这方面遇到了这么多麻烦。

使用此语句:

USE XXXX

SELECT 
    ID, DESCRIPTION, STATUS
FROM 
    PART
WHERE 
    PART.ID LIKE 'PCH%'
    AND PART.DESCRIPTION NOT LIKE '%OBSOLETE%'
    AND PART.STATUS = 'O'

我得到一个包含 34 个条目的表,每个条目都在 PART.STATUS 中包含 O。

我实际上想说的是,只显示不具有 O 状态的值。我知道还有其他方法可以解决此问题。非 O 的值应该为 null,但我很恼火,因为我无法弄清楚“不等于”语句是如何工作的。当我将最后一行切换为:

AND PART.STATUS <> 'O'

或者

AND PART.STATUS != 'O'

我返回了一个空表。

如果我使用线路

AND PART.STATUS IS NULL

我找到了我要找的 table 。

我对“不等于语句”的使用有什么误解?

最佳答案

问题是三值谓词逻辑。当谓词的至少一侧为 NULL 时谓词的结果是 UNKNOWN (无论您使用 =<>>< ,...),但是 WHERE子句仅返回谓词计算结果为 TRUE 的行。所以我们的工作是做出谓词来评估 TRUEPART.STATUS IS NULL 。这是通过添加额外的检查 NULL 来完成的。像:

USE XXXX
SELECT ID, DESCRIPTION,STATUS
FROM PART
WHERE 
PART.ID LIKE 'PCH%'
AND PART.DESCRIPTION NOT LIKE '%OBSOLETE%'
AND (PART.STATUS <> 'O' OR PART.STATUS IS NULL)

这是一个小例子。想象一下这是您的 table ,您正在发布声明 WHERE PART.STATUS <> 'O'

PART(STATUS)
'A'
'O'
NULL

其计算结果为:

WHERE 'A' <> 'O' --TRUE
WHERE 'O' <> 'O' --FALSE
WHERE NULL <> 'O'--UNKNOWN

WHERE子句仅返回谓词结果为 TRUE 的行,您在这里只会得到“A”。

关于sql - SQL Server 中的不等于逻辑问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28723491/

相关文章:

mysql - 无法获得正确的分组依据表达式

sql - 使用 INSERT...SELECT 返回 RETURNING 的替代方法

mysql - 表的左连接部分

python - '' and'逻辑运算符和 "&"按位运算符在Python的这种情况下有什么区别?

c - 关于C的问题!运算符(operator)

sql - ORA-00942:表或 View 不存在(当使用单独的sql时有效,但在oracle函数中不起作用)

php - 无法删除或更新父行,外键约束失败

algorithm - 集合的每个子集的最小和最大元素的或之和

delphi - Delphi中的 boolean 表达式求值顺序?

python - Python的短路有什么值(value)?