2

我有以下语句来查找包含某些值但排除其他值的行:

SELECT * 
FROM tests 
WHERE author = 4  
OR id = -999 
OR id = 276 
OR id = 343 
OR id = 197 
OR id = 170 
OR id = 1058 
OR id = 1328 
OR id = 1417 
AND is_deleted = 0 
AND id NOT IN (457, 2409, 173, 400, 167, 277, 163, 404, 2222, 24, 26, 
               2457, 16, 25, 1639, 2224, 1804, 2308, 197, 461, 1442, 
               1594, 460, 1235, 1814, 2467, 168, 172, 170, 171, 2223, 2535, 2754)

但是,根据 NOT IN 列表,我仍然得到应该排除的行。例如,即使 tests.author = 4,也应排除 id 为 16 的测试。但它正在查询中返回,这是我不想要的。

该语句是根据情况以编程方式创建的。

我犯了语法错误吗?

4

4 回答 4

3

查看SQL Server 的运算符优先级。您会看到and的优先级高于or.

假设您正在寻找一辆红色或蓝色的快速汽车。如果你写:

where speed = 'fast' and color = 'green' or color = 'blue'

SQL Server 将读取:

where (speed = 'fast' and color = 'green') or color = 'blue'

为了响应您的查询,SQL Server 可能会返回一辆缓慢的蓝色汽车。

于 2013-10-21T13:30:08.677 回答
0

将您的查询更改为:

SELECT * 
FROM tests 
WHERE (author = 4  OR id = -999 OR id = 276 OR id = 343 OR id = 197 OR id = 170 OR id = 1058 OR id = 1328 OR id = 1417) 
      AND is_deleted = 0
      AND id NOT IN (457, 2409, 173, 400, 167, 277, 163, 404, 2222, 24, 26, 2457, 16, 25, 1639, 2224, 1804, 2308, 197, 461, 1442, 1594, 460, 1235, 1814, 2467, 168, 172, 170, 171, 2223, 2535, 2754)

你必须把你所有的or放在括号里。

于 2013-10-21T13:19:16.973 回答
0

尝试这个::

SELECT 
* 
FROM tests 
WHERE 
(author = 4  
OR 
id in (-999,276 ,343 ,197 ,170 ,1058 ,1328 ,1417) 
AND is_deleted = 0 )
AND id NOT IN (457, 2409, 173, 400, 167, 277, 163, 404, 2222, 24, 26, 2457, 16, 25, 1639, 2224, 1804, 2308, 197, 461, 1442, 1594, 460, 1235, 1814, 2467, 168, 172, 170, 171, 2223, 2535, 2754)
于 2013-10-21T13:19:49.030 回答
0

Omair,您放错了“(”,首先要清楚您要选择哪个作者。
假设我们需要,
作者的作者= 4或其ID包含在-999、343、197等中并且其已删除状态= 0并且 ID 不能在 457、2409 ......等等
。你所做的是,

author = 4 OR id = -999 OR id = 276 ...
AND is_deleted = 0
AND id NOT IN (457, 2409, 173, 400, 167, 277, 163, 404, 2222, 24, 26, ...)

这根据运算符优先级解释为

(作者 = 4)或(id = -999 或 id = 276 ...
AND is_deleted = 0 且
id 不在(457、2409、173、400、167、277、163、404、2222、24、26、 ... ..)
)

在这里,我们只需要添加适当的 '(' 来根据需要分隔我们的条件

((author = 4) OR (id = -999 OR id = 276 ...)
AND (is_deleted = 0)
AND (id NOT IN (457, 2409, 173, 400, 167, 277, 163, 404, 2222, 24, 26, ...) ) )

所以你可以用适当的括号改变 SQL,

SELECT * FROM tests
WHERE
( (author = 4) OR id in (-999,276 ,343 ,197 ,170 ,1058 ,1328 ,1417) )
AND (is_deleted = 0)
AND (id NOT IN (457, 2409, 173, 400 , 167, 277, 163, 404, 2222, 24, 26, 2457, 16, 25, 1639, 2224, 1804, 2308, 197, 461, 1442, 1594, 460, 1235, 1814, 2,467, 168, 1 , 171, 2223, 2535, 2754))

于 2013-10-21T13:38:08.507 回答