0

我正在尝试在 Mysql 中使用 CASE 语句,虽然 MySQL 没有抱怨我的查询,但它无法提供正确的结果。

我试图做的是相当于:

if value < 20 then 1
elseif value < 30 then 2
elseif value < 40 then 3
.
.
.
else value < 90 then 45 

这是我的 MySQL 声明:

SELECT
    UM.DA,
    UM.PA,
    IF((UM.DA - UM.PA) > 25, UM.DA, UM.PA) AS "PS",
CASE
    WHEN "PS" < 20 THEN 1
    WHEN "PS" < 30 THEN 2
    WHEN "PS" < 40 THEN 3
    WHEN "PS" < 50 THEN 5
    WHEN "PS" < 60 THEN 8
    WHEN "PS" < 70 THEN 12
    WHEN "PS" < 80 THEN 20
    WHEN "PS" < 90 THEN 30
    WHEN "PS" >= 90 THEN 45
END AS "Points",
FROM
    Table1 UM

这是我的结果集:

+-------+-------+--------+--------+
| UM.DA | UM.PA |   PS   | Points |
+-------+-------+--------+--------+
| 19.21 | 18.39 |  18.39 |    1   |
+-------+-------+--------+--------+
| 24.80 | 34.91 |  34.91 |    1   |
+-------+-------+--------+--------+
| 29.72 | 35.89 |  35.89 |    1   |
+-------+-------+--------+--------+

这就是我的结果结果应该是这样的:

+-------+-------+--------+--------+
| UM.DA | UM.PA |   PS   | Points |
+-------+-------+--------+--------+
| 19.21 | 18.39 |  18.39 |    1   |
+-------+-------+--------+--------+
| 24.80 | 34.91 |  34.91 |    3   |
+-------+-------+--------+--------+
| 29.72 | 35.89 |  35.89 |    3   |
+-------+-------+--------+--------+

那么在 MySQL 查询中使用“CASE”的正确方法是什么(这是一个查询,而不是存储过程)

此外,就性能而言,将这个逻辑放在 SQL 查询中更好,还是应该用我选择的编程语言过滤结果?

谢谢!

4

3 回答 3

2

尝试这个:

SELECT DA, PA, PS,
       CASE
           WHEN PS < 20 THEN 1
           WHEN PS < 30 THEN 2
           WHEN PS < 40 THEN 3
           WHEN PS < 50 THEN 5
           WHEN PS < 60 THEN 8
           WHEN PS < 70 THEN 12
           WHEN PS < 80 THEN 20
           WHEN PS < 90 THEN 30
           ELSE 45
       END AS "Points"
FROM (SELECT DA, PA,
             IF((DA - PA) > 25, DA, PA) AS PS
      FROM Table1 UM) temp

它将PS计算移动到子查询中,因此可以在CASE表达式中引用它而无需重复计算。并且PS必须是名称,而不是字符串。

于 2013-07-30T14:37:16.583 回答
0

"PS"只是一个字符串。它不是您创建的别名,因此您将字符串与整数进行比较,mysql 会自动将该"PS"字符串转换为 int,使其为 0,因此所有情况都匹配。你要

CASE
    WHEN PS < 20 THEN 1
         ^^---note lack of quotes
于 2013-07-30T14:33:59.917 回答
0

我认为您不能在查询中为列使用别名,除非它是 ORDER BY 子句。结果(特别是由于语音标记而不是反引号的别名)您正在进行字符串比较。将查询更改为:

SELECT
    UM.DA,
    UM.PA,
    IF((UM.DA - UM.PA) > 25, UM.DA, UM.PA) AS "PS",
CASE
    WHEN IF((UM.DA - UM.PA) > 25, UM.DA, UM.PA) < 20 THEN 1
    WHEN IF((UM.DA - UM.PA) > 25, UM.DA, UM.PA) < 30 THEN 2
    WHEN IF((UM.DA - UM.PA) > 25, UM.DA, UM.PA) < 40 THEN 3
    WHEN IF((UM.DA - UM.PA) > 25, UM.DA, UM.PA) < 50 THEN 5
    WHEN IF((UM.DA - UM.PA) > 25, UM.DA, UM.PA) < 60 THEN 8
    WHEN IF((UM.DA - UM.PA) > 25, UM.DA, UM.PA) < 70 THEN 12
    WHEN IF((UM.DA - UM.PA) > 25, UM.DA, UM.PA) < 80 THEN 20
    WHEN IF((UM.DA - UM.PA) > 25, UM.DA, UM.PA) < 90 THEN 30
    WHEN IF((UM.DA - UM.PA) > 25, UM.DA, UM.PA) >= 90 THEN 45
END AS "Points",
FROM
    Table1 UM
于 2013-07-30T14:34:51.263 回答