我需要在WHERE
子句中添加一个条件,该条件始终为true,但它必须引用其中一个列,例如:
ID
是主键(因此NOT NULL
)
我会执行一个选择:
SELECT *
FROM Table
WHERE ID IS NOT NULL
是否会忽略或检查每一行的这种情况?
答案 0 :(得分:4)
SQL Server可以在编译时确定此条件始终为true,并且无需在运行时进行检查。
CREATE TABLE #T
(
ID INT CONSTRAINT PK_ID PRIMARY KEY NONCLUSTERED,
X INT CONSTRAINT UQ_X UNIQUE
)
SELECT X
FROM #T
WHERE ID IS NOT NULL;
DROP TABLE #T
在上面的执行计划中,唯一访问的索引是UQ_X
,这甚至不包含可以进行运行时评估的ID
列。
相比之下,如果ID
可以为空(并且用唯一约束替换而不是主键,因为PK不允许NULL)那么检查当然需要在运行时进行,所以该计划需要检索列,可能看起来像以下之一。
答案 1 :(得分:0)
执行以下查询时:
SELECT * FROM Table WHERE ID IS NOT NULL;
在ID被定义为主键的情况下,它将显示表中的所有行。从显示的角度来看,这与SELECT * FROM Table;
类似。但是,条件不会被忽略。(即将检查where
子句)
答案 2 :(得分:0)
SELECT *
FROM TableName
WHERE (ID IS NOT NULL)
将显示ID不为空的所有数据。
如果ID
是表格中的主键,则ID不会为空!
因此,您将从表中获取所有数据