SQL - 简单选择查询的麻烦

时间:2011-05-30 04:06:52

标签: sql

我在弄清楚为什么下面的SQL查询不起作用时遇到了一些麻烦......当members_only设置为0时,它仍然显示它们......

SELECT * 
  FROM reports 
 WHERE story = "1" 
    OR barebones = "1" 
   AND members_only = "1"

5 个答案:

答案 0 :(得分:8)

这取决于您的数据,但您可能不知道AND在SQL中的优先级高于OR,因此您的查询确实评估为:

SELECT * 
  FROM reports 
 WHERE story = '1'
    OR (barebones = '1' AND members_only = '1')

考虑在其他答案中使用不同的括号来明确声明您的意图

答案 1 :(得分:4)

使用括号来区分您澄清WHERE条件。

SELECT * 
FROM reports 
WHERE (story = '1' OR barebones = '1')
  AND members_only = '1'

答案 2 :(得分:3)

缺少括号? 你想做这样的事情:

 SELECT *
 FROM reports
 WHERE (story = "1" OR barebones = "1") AND members_only = "1"

答案 3 :(得分:3)

我会说因为它将查询读作:

WHERE (story = '1') OR (barebones = '1' AND members_only = '1')

story = '1'起,条件得到满足

OR子句可能很棘手 - 您经常需要明确告诉查询它所属的位置。我想,你想要这个:

WHERE (story = '1' OR barebones = '1') AND members_only = '1'

答案 4 :(得分:2)

您缺少括号。

以下代码将起作用,假设members_only HAS为“1”,但只有 story 准系统必须为“1”。

SELECT * 
  FROM reports 
 WHERE 
    (story = "1" OR barebones = "1")
    AND members_only = "1"

您应该阅读TSQL Operator Precedence

在原始代码中,假设以下内容:

  • 商店 = 1
  • 准系统 = 1
  • * members_only * = 0

由于运算符优先级,首先计算准系统和* members_only *,并将其计算为false。

在此之后,将第一次布尔评估(false)(也称为The Right Side)的结果与(story = "1")(也称为The Left Side)进行比较。

The Right Side的计算结果为false,但The Left Side的计算结果为true。

由于最终的布尔压缩使用OR运算符,因此最终结果为TRUE,因此无论准系统的值是什么,都会返回该记录。 * members_only *,因为The Left Side总是评估为True。