我正在尝试使用Oracle SQL update语句使用“开关”case语句,如下所述:
update MY_TABLE SET STATE_ABBREVIATION=
(CASE STATE
WHEN 'MAHARASHTRA' THEN 'MH'
WHEN 'ASSAM' THEN 'AS'
WHEN 'HIMACHAL%' THEN 'HP'
...
ELSE
STATE
END
);我从线程SQL - UPDATE中每个SET命令的哪个子句?得到了这条线索
问题是通配符字段没有像预期的那样正常工作。国家专栏可能像“喜马喀尔邦”和“喜马恰尔邦”这样的价值观。
我还搜索了https://community.oracle.com/thread/290198,其中一个答案使用了“ searched case”,效果很好。。。
CASE
(WHEN STATE LIKE 'ANDHRA%' THEN 'AP'
WHEN STATE LIKE 'HIMACHAL%' THEN 'HP'
END我们如何才能在切换的情况下实现这一点?我也试过
update MY_TABLE SET STATE_ABBREVIATION=
(CASE STATE
WHEN 'MAHARASHTRA' THEN 'MH'
WHEN 'ASSAM' THEN 'AS'
WHEN LIKE 'HIMACHAL%' THEN 'HP'
...
ELSE
STATE
END
); 这也不起作用。
(SQL错误: ORA-00905:缺失关键字00905。00000 -“缺少关键字”)。
发布于 2015-06-18 05:49:09
在任何情况下都必须使用搜索的版本。
见语法图
发布于 2015-06-18 05:49:18
您可以在所有条件下使用LIKE,因为= 'aaaa'和LIKE 'aaaa'在输出方面没有差别。
update MY_TABLE SET STATE_ABBREVIATION=
(CASE
WHEN STATE LIKE 'MAHARASHTRA' THEN 'MH'
WHEN STATE LIKE 'ASSAM' THEN 'AS'
WHEN STATE LIKE 'HIMACHAL%' THEN 'HP'
...
ELSE
STATE
END
);发布于 2015-06-18 06:25:19
在CASE表达式中使用=和LIKE运算符不应该有任何问题。
例如,
表
SQL> CREATE TABLE t AS SELECT * FROM(
2 WITH DATA(state) AS(
3 SELECT 'MAHARASHTRA' FROM dual UNION ALL
4 SELECT 'ASSAM' FROM dual UNION ALL
5 SELECT 'HIMACHAL PRADESH' FROM dual UNION ALL
6 SELECT 'ANDHRA PRADESH' FROM dual
7 )
8 SELECT * FROM DATA);
Table created.
SQL> SELECT * FROM t;
STATE
----------------
MAHARASHTRA
ASSAM
HIMACHAL PRADESH
ANDHRA PRADESH
SQL>CASE语句
SQL> SELECT CASE
2 WHEN state = 'MAHARASHTRA' THEN 'MH'
3 WHEN state = 'ASSAM' THEN 'AS'
4 WHEN state LIKE 'HIMACHAL%' THEN 'HP'
5 ELSE state
6 END
7 FROM t;
CASEWHENSTATE='M
----------------
MH
AS
HP
ANDHRA PRADESH更新语句
SQL> UPDATE t
2 SET state = (
3 CASE
4 WHEN state = 'MAHARASHTRA' THEN 'MH'
5 WHEN state = 'ASSAM' THEN 'AS'
6 WHEN state LIKE 'HIMACHAL%' THEN 'HP'
7 ELSE state
8 END
9 );
4 rows updated.测试用例
SQL> select * from T;
STATE
----------------
MH
AS
HP
ANDHRA PRADESH
SQL>因此,成功地完成了更新。
https://stackoverflow.com/questions/30907297
复制相似问题