Selon la syntaxe 12.4 Control Flow Functions :: CASE actuelle, la compréhension et la manipulation correcte des avertissements, une option est de faire quelque chose comme:
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)
Une autre option (plus bavard, mais sans avertissements):
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)
Et une autre option:
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)
Voir db-fiddle.
Avez-vous essayé 'QUAND' AL 'ET' AK 'PUIS 0,04'? Je n'ai pas MySQL, mais ça fonctionne dans Postgres. –
Merci! J'ai essayé votre suggestion, et cela ne fonctionne pas. Remplacer ET avec OU a abouti le même. – Benson
Oh oui, bien sûr, vous voudriez 'OR' là. Que faire si vous faites 'CASE WHEN état = 'AL' OU état = 'AK' PUIS 0,04'. C'est comme ça que je l'ai fait dans Postgres. –