我不敢相信我在这方面遇到了这么多麻烦。
使用此语句:
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
的行。所以我们的工作是做出谓词来评估 TRUE
当PART.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/