【问题标题】:Where doesn't affect. Why?哪里不影响。为什么?
【发布时间】:2011-02-01 10:26:27
【问题描述】:

我有一个 MySQL 查询,看起来像这样:

SELECT
  client.id, client.vorname, client.nachname, DATE_FORMAT(geburtsDatum, '%d.%m.%Y'), zahlung.zuUebBet, zahlung.betrag
FROM
  zahlung JOIN client ON ( zahlung.mitgliedsNr = client.id )
WHERE
  client.typ = 'U'
OR
  client.typ is null
AND
  zahlung.typ = 'Beitrag'
AND
  anBGueberwiesen = '0000-00-00'
AND
  zahlung.zuUebBet IS NOT NULL
AND 
  (
    zahlung.vomBGeinheb = 0
  OR
    zahlung.vomBGeinheb is null
  )

一切正常,但情况如下:

zahlung.zuUebBet IS NOT NULL

看起来像是被忽略了。 (我得到包含很多 NULL 的行)

有人知道怎么回事吗?

【问题讨论】:

  • 请下次尝试格式化您的代码以使其更具可读性(这次我已经这样做了)

标签: sql mysql operators


【解决方案1】:

请查看the operator precedence of mysqlOR 的优先级低于 AND,因此您必须将其放入大括号中才能获得所需的结果:

  client.typ = 'U'
OR
  client.typ is null

完整的 WHERE 块应如下所示:

  (
    client.typ = 'U'
  OR
    client.typ is null
  )
AND
  zahlung.typ = 'Beitrag'
AND
  anBGueberwiesen = '0000-00-00'
AND
  zahlung.zuUebBet IS NOT NULL
AND 
  (
    zahlung.vomBGeinheb = 0
  OR
    zahlung.vomBGeinheb is null
  )

否则,sql语句将被视为如下(我认为这不是您想要的)(我添加了大括号以使事情变得清晰):

  client.typ = 'U'
OR
  (
    client.typ is null
  AND
    zahlung.typ = 'Beitrag'
  AND
    anBGueberwiesen = '0000-00-00'
  AND
    zahlung.zuUebBet IS NOT NULL
  AND 
    (
      zahlung.vomBGeinheb = 0
    OR
      zahlung.vomBGeinheb is null
    )
  )

【讨论】:

    【解决方案2】:

    在 where 条件之间使用适当的多级括号。 您在最后一部分中使用了括号,但前几个条件的 AND、OR 也需要用括号括起来。

    【讨论】:

      【解决方案3】:

      !ISNULL('zahlung.zuUebBet') 试试这个而不是zahlung.zuUebBet IS NOT NULL。我仍然无法解释为什么会这样,但它确实不止一次地改变了我的结果。

      对于任何更了解 MySQL 的人,请解释为什么 !ISNULL(<row>); != <row> IS NOT NULL

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-29
        • 2015-02-17
        • 1970-01-01
        • 1970-01-01
        • 2013-04-28
        • 2023-04-08
        相关资源
        最近更新 更多