【问题标题】:Sql query where condition and orsql查询where条件和或
【发布时间】:2014-10-18 09:17:11
【问题描述】:

我的表中有以下数据:

id:1,名称:TOM,可见:1,field_1:EMPTY,field_2:EMPTY,field_3:EMPTY。

SELECT id, name FROM table 
WHERE name <> 'TOM' AND visible = 1 
      AND field_1 <> '' OR field_2 <> '' OR field_3 <> ''

我只想选择名称与“name1”不同且至少有一个字段不为空的行。

我预计此查询没有结果,但我得到:id,TOM,比如 where name 条件被覆盖。

【问题讨论】:

  • 定义“空”。您的意思是 null、blank 还是字面意义上的“EMPTY”?
  • 你能提供 sqlfiddle 你的数据吗
  • 空白字段,field_1 2 和 3 是 varchars。原谅

标签: mysql where where-clause


【解决方案1】:

您的问题是优先级:将 OR 括起来:

SELECT id, name
FROM table 
WHERE name <> 'TOM'
AND visible = 1 
AND (field_1 <> '' OR field_2 <> '' OR field_3 <> '')

【讨论】:

    【解决方案2】:

    我怀疑,其中一个字段真的是 != '',使得条件对“Tom”记录有效。您必须使用括号对 OR 条件进行分组:

    SELECT id, name FROM table 
    WHERE name <> 'TOM' AND visible = 1 
          AND (field_1 <> '' OR field_2 <> '' OR field_3 <> '')
    

    【讨论】:

      【解决方案3】:

      and 运算符的优先级高于 or(有关详细信息,请参阅 the documentation),所以如果我们接受您的查询:

      SELECT id, name FROM table 
      WHERE name <> 'TOM' AND visible = 1 
            AND field_1 <> '' OR field_2 <> '' OR field_3 <> '' 
      

      并添加澄清括号,我们将得到:

      SELECT id, name FROM table 
      WHERE (name <> 'TOM' AND visible = 1 AND field_1 <> '') 
            OR field_2 <> '' 
            OR field_3 <> ''
      

      这不是你想要的。您可以通过显式添加括号来解决此问题:

      SELECT id, name 
      FROM   table 
      WHERE  name <> 'TOM' AND 
             visible = 1 AND
             (field_1 <> '' OR field_2 <> '' OR field_3 <> '')
      

      【讨论】:

        【解决方案4】:

        你应该添加 ()

        SELECT id, name
        FROM    table 
        WHERE name <> 'TOM'
        AND visible = 1 
        AND (field_1 <> ''OR field_2 <> '' OR field_3 <> '')
        

        【讨论】:

          【解决方案5】:

          请将空白字段比较放在一个括号中,如粗体所示 从表中选择 id、名称 WHERE name 'TOM' AND visible = 1 AND ( field_1 '' OR field_2 '' OR field_3 '' )

          【讨论】:

            【解决方案6】:
            1. 你必须插入括号
            2. 空字段真的是空的吗?也许''不会带来正确的结果

            【讨论】:

              猜你喜欢
              • 2011-04-25
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-04-20
              • 2017-04-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多