2017-07-23 2 views
0

comme ceci:Puis-je mettre deux (ou plus) critères dans une clause WHEN of CASE ... END dans MySQL?

SET v_tax_rate = 
    CASE state 
     WHEN 'AL', 'AK' THEN 0.04 
     WHEN 'CA' THEN 0.06 
     WHEN 'WY' THEN 0.03 
    END; 

je mets 'AL' et 'AK' dans un QUAND. Mais ça ne marche pas. Je ne peux pas le créer avec succès, en recevant une invite d'erreur.

Est-il possible de le faire en MySQL?

+1

Avez-vous essayé 'QUAND' AL 'ET' AK 'PUIS 0,04'? Je n'ai pas MySQL, mais ça fonctionne dans Postgres. –

+0

Merci! J'ai essayé votre suggestion, et cela ne fonctionne pas. Remplacer ET avec OU a abouti le même. – Benson

+1

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. –

Répondre

1

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.

+0

Cela peut fonctionner. Merci pour votre réponse si soigneuse et élaborée! C'est si gentil de votre part. Je vous remercie! – Benson