尚未设置时使用 CASE 更新
Using CASE to update when not already set
我有一个简单的 table,如下所示:
+--------+-------+----------+
| client | value | status |
+--------+-------+----------+
| A | A1 | positive |
| B | B2 | neutral |
| C | C3 | negative |
| D | B2 | neutral |
| E | A1 | positive |
+--------+-------+----------+
状态字段直接与值字段相关,但是值字段会自动更改,因此我使用 select 语句来显示哪些状态字段需要更新,如下所示:
SELECT client, value, status,
CASE value
WHEN A1 THEN postive
WHEN B2 THEN neutral
ELSE negative
END AS new_status
FROM table
WHERE status <> CASE value
WHEN A1 THEN postive
WHEN B2 THEN neutral
ELSE negative
END
这很好用,但我从来不喜欢在 SELECT 和 WHERE 子句中出现完全相同的 CASE。有没有更好的方法来编写此 SELECT 以仅显示需要更新的状态字段?
使用子查询:
SELECT *
FROM (
SELECT client,
value,
status,
CASE value
WHEN 'A1' THEN 'postive'
WHEN 'B2' THEN 'neutral'
ELSE 'negative'
END AS new_status
FROM table
) AS t
WHERE status <> new_status
我有一个简单的 table,如下所示:
+--------+-------+----------+
| client | value | status |
+--------+-------+----------+
| A | A1 | positive |
| B | B2 | neutral |
| C | C3 | negative |
| D | B2 | neutral |
| E | A1 | positive |
+--------+-------+----------+
状态字段直接与值字段相关,但是值字段会自动更改,因此我使用 select 语句来显示哪些状态字段需要更新,如下所示:
SELECT client, value, status,
CASE value
WHEN A1 THEN postive
WHEN B2 THEN neutral
ELSE negative
END AS new_status
FROM table
WHERE status <> CASE value
WHEN A1 THEN postive
WHEN B2 THEN neutral
ELSE negative
END
这很好用,但我从来不喜欢在 SELECT 和 WHERE 子句中出现完全相同的 CASE。有没有更好的方法来编写此 SELECT 以仅显示需要更新的状态字段?
使用子查询:
SELECT *
FROM (
SELECT client,
value,
status,
CASE value
WHEN 'A1' THEN 'postive'
WHEN 'B2' THEN 'neutral'
ELSE 'negative'
END AS new_status
FROM table
) AS t
WHERE status <> new_status