在Select Statement中使用CASE

时间:2013-10-29 05:06:15

标签: mysql case

我希望下面的查询根据日期范围命名案例列 - 但是所有都默认为错误 - 我缺少什么?自从我在mySQL工作以来,已经有一段时间了。我试图根据逾期,今天,明天,30天,60天,90天的间隔进行分组。

    SELECT DATE_SUB(CURDATE(), INTERVAL 1 DAY)AS rDate,

    CURDATE()AS rDate,DATE_ADD(CURDATE(), INTERVAL 1 DAY)AS rDate,

    DATE_ADD(CURDATE(), INTERVAL 7 DAY)AS rDate,

    DATE_ADD(CURDATE(), INTERVAL 14 DAY)AS rDate,

    DATE_ADD(CURDATE(), INTERVAL 30 DAY)AS rDate,

    DATE_ADD(CURDATE(), INTERVAL 60 DAY)AS rDate,

    DATE_ADD(CURDATE(), INTERVAL 90 DAY)AS rDate,

    CASE a.nextDueDate

    WHEN a.nextDueDate < CURDATE() THEN 'Overdue'

    WHEN a.nextDueDate > CURDATE() AND a.nextDueDate < (DATE_ADD(CURDATE(), INTERVAL 7 
    DAY))THEN '7 Days'

    WHEN a.nextDueDate > CURDATE() AND a.nextDueDate < (DATE_ADD(CURDATE(), INTERVAL 
    14 DAY))THEN '15 Days'

    WHEN a.nextDueDate > CURDATE() AND a.nextDueDate < (DATE_ADD(CURDATE(), INTERVAL 30 DAY))THEN '30 Days'

    WHEN a.nextDueDate > CURDATE() AND a.nextDueDate < (DATE_ADD(CURDATE(), INTERVAL 60 DAY))THEN '60 Days'

    WHEN a.nextDueDate > CURDATE() AND a.nextDueDate < (DATE_ADD(CURDATE(), INTERVAL 90 DAY))THEN '90 Days'

    ELSE 'Error'

    END,

    g.groupId,g.name AS groupName,l.logId,l.name AS logName, i.itemID,

    i.name AS itemName, le.userName,completed, i.optimalMin,i.optimalMax ,le.value,

    u.name AS unitDescription,

    g1.parentId AS parentId1, g1.name AS group1Name,g2.parentId AS parentId2, g2.name 
    AS group2Name,

    g3.parentId AS parentId3, g3.name AS group3Name,

    a.name AS activityName,scheduleType,scheduleInterval,a.details,nextDueDate

    FROM logExceptions le

    INNER JOIN logs l ON l.logID = le.logID

    INNER JOIN groups g ON g.groupId = l.groupId

    INNER JOIN items i ON le.itemId = i.itemId

    INNER JOIN activities a ON l.logId = a.logId

    LEFT JOIN units u ON i.unitId = u.unitId

    LEFT JOIN groups g1 ON g.parentId = g1.groupId

    LEFT JOIN groups g2 ON g1.parentId = g2.groupId

    LEFT JOIN groups g3 ON g2.parentId = g3.groupId

    WHERE  nextDueDate IS NOT NULL

1 个答案:

答案 0 :(得分:2)

a.nextDueDate关键字后删除CASE

CASE表达式有两种形式:

CASE <expression>
    WHEN <test-value1> THEN <result-value1>
    WHEN <test-value2> THEN <result-value2>
    ...
    ELSE <else-value>
END

在此表单中,<expression>的值与每个<test-valueN>进行比较,如果匹配,则返回相应的<result-valueN>。如果不匹配,则返回<else-value>。此表单类似于其他编程语言中的switchcase语句。

另一种形式是:

CASE WHEN <test-expression1> THEN <result-value1>
     WHEN <test-expression2> THEN <result-value2>
     ...
     ELSE <else-value>
END

在这种情况下,将评估每个<test-expressionN>,如果一个为真,则返回相应的<result-valueN>。如果均不为真,则返回<else-value>。这类似于其他编程语言中的if/then/elseif/else

由于您使用的是CASE后一种类型,因此您不应该在CASE之后立即使用表达式。