应该在这个where子句中命令吗?

时间:2013-04-02 20:37:33

标签: mysql

我通过更改WHERE条件的顺序得到了不同的结果,但我不明白为什么:

SELECT 
    ...

WHERE (
    -- Ramps that start this month
    (r.start_dte > ? AND r.start_dte <= ?)

    OR

    -- Ramps that end this month and have no follow-up.
    (r.end_dte >= ? AND r.end_dte <= ? AND r.id = m.latestId)
)

-- Throw out expired schedules or contracts
AND (s.term_dte > r.start_dte or s.term_dte is null)
AND (c.term_dte > r.start_dte or c.term_dte is null)

-- Throw out a ramp if its end date is before its start date
AND (r.end_dte > r.start_dte)

AND s.name not like '%zz%'

我的目的是满足前两个条件中的一个(斜坡必须从本月开始,或者本月结束并且没有后续跟踪),以及所有其他条件都要满足。我没有写过这个吗?

我知道事情不正常,因为我的结果违反了倒数第二个AND条件。

2 个答案:

答案 0 :(得分:2)

关于你的第一个问题:对我而言,你的查询在你的规范方面看起来是正确的。

对于您的第二个问题,我建议您重写您的条件,使其符合数字排序(左侧较小的日期/值):

...
WHERE (
    -- Ramps that start this month
    (? < r.start_dte AND r.start_dte <= ?)

    OR

    -- Ramps that end this month and have no follow-up.
    (? <= r.end_dte AND r.end_dte <= ? AND r.id = m.latestId)
)

-- Throw out expired schedules or contracts
AND (r.start_dte < s.term_dte or s.term_dte is null)  -- condition (3)
AND (r.start_dte < c.term_dte or c.term_dte is null)

-- Throw out a ramp if its end date is before its start date
AND (r.start_dte < s.term_dte)  -- condition (5)

AND s.name not like '%zz%'

现在您可以看到条件(3)弱于条件(5),因此 (3)是多余的,可以省略(5)是过于强烈和错误地过滤掉结果。

答案 1 :(得分:0)

我的问题在于第五个条款

AND (r.start_dte < r.end_dte)

我忘了r.end_dte可能为空。这给了我奇怪的结果。我把它改成了

AND (r.start_dte < r.end_dte OR r.end_dte is null)