满足WHERE标准 - T-SQL

时间:2013-01-15 15:51:21

标签: sql-server tsql

我需要帮助改进下表中查询的WHERE子句:

Key   |   Name   |   Role   |   Location
111   |   Bob    | Manager  |  All Locations
222   |   Jim    | Manager  |  All Locations
333   |   Tim    | Sales    |  Washington
444   |   Roy    | Sales    |  New York
555   |   Lee    | Sales    |  All Locations
666   |   Gus    | Sales    |  All Locations
777   |   Joe    | Admin    |  All Locations
888   |   Jen    | Admin    |  New York

我需要排除所有“所有位置”记录,但保留“所有位置”记录,其中“角色”是“管理员”。为了获得理想的结果:

Key   |   Name   |   Role   |   Location
111   |   Bob    | Manager  |  All Locations
222   |   Jim    | Manager  |  All Locations
333   |   Tim    | Sales    |  Washington
444   |   Roy    | Sales    |  New York
888   |   Jen    | Admin    |  New York

我认为下面的查询将排除所有所有位置记录,包括经理记录。

SELECT * FROM Table
WHERE (Location <> 'All Locations' AND Role <> 'Manager')

4 个答案:

答案 0 :(得分:4)

您需要展开{​​{1}}:

WHERE

请参阅SQL Fiddle with Demo

返回结果:

select *
from yourtable
where
(
  role = 'Manager'
  and location = 'All Locations'
)
or
(
  location <> 'All Locations'
)

答案 1 :(得分:1)

SELECT * FROM Table
WHERE (Location != 'All Locations' OR (Location = 'All Locations' AND Role = 'Manager')

答案 2 :(得分:1)

您说“排除所有'所有位置'的记录,但保留”所有位置“记录,其中”角色“是”管理员“。这是否意味着 排除 所有位置记录,其中角色是 不是 经理?即,你不想要包括记录111和222 ??

根据De Morgans Law,Not A And Not B等同于Not(A或B)

在你的情况下,一个谓词是正面的而另一个是否定的,所以De Morgan会读到:

  Not (A And not B) <=> (Not A or B), i.e., 

这意味着 包含 所有非Not All Locations或Manager的记录。

如果是,那么你需要的是:

  ... Where Location != 'All Locations' Or Role = 'Manager'

答案 3 :(得分:0)

您应该使用OR而不是AND

SELECT * FROM Table
WHERE (Location <> 'All Locations' OR Role = 'Manager')