哪里不影响。为什么?

时间:2011-02-01 10:26:28

标签: sql mysql operators

我有一个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)

任何人都知道发生了什么事?

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

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

完整的WHERE-block应如下所示:

  (
    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 :(得分:0)

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

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