2017-07-23 30 views
0

就像这样:我可以在MySQL中的CASE ... END子句中的一个WHEN中放置两个(或更多)条件吗?

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

我把 'AL' 和 'AK' 在一个WHEN。但它不起作用。我无法成功创建它,并收到错误提示。

在MySQL中可以这样做吗?

+1

你试过了吗?当'AL'和'AK'然后是0.04'?我没有MySQL,但它在Postgres中有效。 –

+0

谢谢!我尝试了你的建议,但它不起作用。替换AND与OR导致相同。 – Benson

+1

哦,是的,当然你会想'OR'在那里。如果你做'CASE当'状态='AL'或状态='AK'然后0.04'。这就是我在Postgres中真正做到的。 –

回答

1

根据目前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

+0

这可以工作。非常感谢您的细心回复!你真好。谢谢! – Benson

相关问题