使用select语句使用null值发出问题

时间:2014-03-11 17:45:04

标签: sql sql-server-2008 tsql

我正在尝试使用此select语句但我的问题是我尝试在我的select语句中使用的此ID具有空值。即使ID 542具有空值,但我知道未来的事实将会有一个“完整”的状态。它的价值。 FLAG字段的3个可能值是COMPLETE,NOT COMPLETE和NULL。我想用这个select语句实现的目的是查看FLAG不是' COMPLETE'的所有记录。如果我现在运行我的查询,它将不会返回任何内容,但如果我删除FLAG<>' COMPLETE'然后它将返回记录ID 542,但标志值为空。  这是我的代码

SELECT ID, DT, STAT FROM myTable WHERE ID = 542 and FLAG <> 'COMPLETE'

3 个答案:

答案 0 :(得分:2)

将NULL转换为文本:

SELECT ID, DT, STAT 
FROM myTable 
WHERE ID = 542 and ISNULL(FLAG,'NULL') <> 'COMPLETE'

答案 1 :(得分:1)

SELECT ID, DT, STAT 
FROM myTable 
WHERE ID = 542 and ISNULL(FLAG, 'NOT COMPLETE') <> 'COMPLETE' 

由于FLAG为空,因此无法与“完成”进行比较,而您错过了该条目......

或:

SELECT ID, DT, STAT 
FROM myTable 
WHERE ID = 542 AND (FLAG <> 'COMPLETE' OR FLAG IS NULL)

答案 2 :(得分:1)

欢迎使用SQL的三重逻辑!众所周知的兄弟truefalse有一个名为unknown的秘密继姐妹。与null进行比较的结果始终为unknown

快速解决方法是添加明确的is null支票:

where Flag is null or Flag <> 'COMPLETE'

请注意,not unknown仍为unknown,因此无法正常工作:

where not Flag = 'COMPLETE' -- Won't work

事实上,null甚至不等于null。但null也不等于null

要获得更多乐趣,请查看维基百科。它有一整页专门用于three valued logic in SQL