根据目前12.4 Control Flow Functions :: CASE语法,理解和警告的正确处理,一个选择是像做:
mysql> DROP TABLE IF EXISTS `tbl_sta`;
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TABLE IF NOT EXISTS `tbl_sta` (
-> `state` CHAR(2) NOT NULL
->);
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO `tbl_sta`
-> (`state`)
-> VALUES
-> ('AL'), ('AK'),
-> ('CA'), ('WY');
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> SELECT
-> `state`,
-> CASE `state`
-> WHEN `state` NOT IN ('AL', 'AK') THEN 0.04
-> WHEN 'CA' THEN 0.06
-> WHEN 'WY' THEN 0.03
-> END `result`
-> FROM `tbl_sta`;
+-------+--------+
| state | result |
+-------+--------+
| AL | 0.04 |
| AK | 0.04 |
| CA | 0.06 |
| WY | 0.03 |
+-------+--------+
4 rows in set, 4 warnings (0.01 sec)
mysql> SHOW WARNINGS;
+---------+------+----------------------------------------+
| Level | Code | Message |
+---------+------+----------------------------------------+
| Warning | 1292 | Truncated incorrect DOUBLE value: 'AL' |
| Warning | 1292 | Truncated incorrect DOUBLE value: 'AK' |
| Warning | 1292 | Truncated incorrect DOUBLE value: 'CA' |
| Warning | 1292 | Truncated incorrect DOUBLE value: 'WY' |
+---------+------+----------------------------------------+
4 rows in set (0.00 sec)
mysql> SELECT 'AL' = 0 /* FALSE */, 'AL' = 1 /* TRUE */;
+----------+----------+
| 'AL' = 0 | 'AL' = 1 |
+----------+----------+
| 1 | 0 |
+----------+----------+
1 row in set, 2 warnings (0.00 sec)
mysql> SHOW WARNINGS;
+---------+------+----------------------------------------+
| Level | Code | Message |
+---------+------+----------------------------------------+
| Warning | 1292 | Truncated incorrect DOUBLE value: 'AL' |
| Warning | 1292 | Truncated incorrect DOUBLE value: 'AL' |
+---------+------+----------------------------------------+
2 rows in set (0.00 sec)
另一种选择(更详细的,但没有警告):
mysql> SELECT
-> `state`,
-> CASE `state`
-> WHEN IF(`state` IN ('AL', 'AK'), `state`, NULL) THEN 0.04
-> WHEN 'CA' THEN 0.06
-> WHEN 'WY' THEN 0.03
-> END `result`
-> FROM `tbl_sta`;
+-------+--------+
| state | result |
+-------+--------+
| AL | 0.04 |
| AK | 0.04 |
| CA | 0.06 |
| WY | 0.03 |
+-------+--------+
4 rows in set (0.00 sec)
而另一种选择:
mysql> SELECT
-> `state`,
-> CASE `state`
-> WHEN CASE WHEN `state` IN ('AL', 'AK')
-> THEN `state` END THEN 0.04
-> WHEN 'CA' THEN 0.06
-> WHEN 'WY' THEN 0.03
-> END `result`
-> FROM `tbl_sta`;
+-------+--------+
| state | result |
+-------+--------+
| AL | 0.04 |
| AK | 0.04 |
| CA | 0.06 |
| WY | 0.03 |
+-------+--------+
4 rows in set (0.00 sec)
请参阅db-fiddle。
你试过了吗?当'AL'和'AK'然后是0.04'?我没有MySQL,但它在Postgres中有效。 –
谢谢!我尝试了你的建议,但它不起作用。替换AND与OR导致相同。 – Benson
哦,是的,当然你会想'OR'在那里。如果你做'CASE当'状态='AL'或状态='AK'然后0.04'。这就是我在Postgres中真正做到的。 –