Sql server 使用!=在SQL中

Sql server 使用!=在SQL中,sql-server,Sql Server,我有表作业: CREATE TABLE [dbo].[Jobs] ( [Id] [int] IDENTITY(1,1) NOT NULL, [ClientId] [int] NOT NULL, [JobType] [int] NOT NULL, [Priority] [int] NOT NULL, [Done] [smallint] NULL ) ON [PRIMARY] 并在其中记录: Id ClientId JobType Priority

我有表
作业

CREATE TABLE [dbo].[Jobs]
(
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [ClientId] [int] NOT NULL,
    [JobType] [int] NOT NULL,
    [Priority] [int] NOT NULL,
    [Done] [smallint] NULL
) ON [PRIMARY]
并在其中记录:

Id  ClientId    JobType Priority    Done
-----------------------------------------
1   41          1       1           NULL
为什么这个问题

SELECT JobType 
FROM Jobs 
WHERE Done != 1 
  AND ClientId = 41

不返回任何内容?

因为
NULL
值是未知值

必须使用
NULL
notnull
谓词来比较可空值。这应该起作用:

SELECT JobType 
from Jobs 
where (Done != 1 OR Done IS NULL) 
 and ClientId=41

NULL没有任何类型。一事无成。所以不能将某个值与NULL进行比较。在大多数DBMS上,即使是
NULL=NULL
也会返回FALSE(我知道外部也有一些,但执行方式不同)。为了防止这种情况,可以在where子句中使用诸如
IS NULL
IS NOT NUL
L之类的结构。。基于此,您的查询应该如下所示:

SELECT "JobType" FROM "Jobs" WHERE "Done" IS NULL
如果
Done
可以有多个值,您可以使用

SELECT "JobType" 
FROM "Jobs" 
WHERE
   "Done" IS NULL OR
   "Done" <> 1
选择“作业类型”
来自“乔布斯”
哪里
“Done”为NULL或
“完成”1

甚至
=
有效,
是我所说的不平等的更符合SQL的方式。

SQL
中。 ISNULL在此处使用指定的值(0),当“完成”为null时

SELECT JobType FROM Jobs 
WHERE ISNULL(Done, 0) <> 1 AND ClientId = 41
从作业中选择作业类型
其中ISNULL(Done,0)1和ClientId=41

使用
where Done为NULL
您可以尝试
where ISNULL(Done,0)!=1和ClientId=41
NULL
在SQL中有点棘手。。。。您无法使用常规比较运算符对其进行比较-只有
为NULL
不为NULL
才会进行比较work@marc_s:同意可能没有关于
Done
的索引,但由于ISNULL阻止DB引擎进行大多数优化,当表达式要应用一个条件时,我总是避免这样做。@iDevlop:同意-但在这里,如果不能只使用
Done is NOT NULL
或诸如此类的话,可能需要这样做……但是Done可能是NULL和“0”(可能还有任何其他值),我需要精确的=1@vico-查看我的更新aswer,使用
(完成!=1或完成为空)