【问题标题】:Updating table using wildcard in Switch case statement在 Switch case 语句中使用通配符更新表
【发布时间】:2015-06-18 05:41:36
【问题描述】:

我正在尝试使用如下所述的“SWITCHED”案例语句来使用 Oracle SQL 更新语句:

update MY_TABLE SET STATE_ABBREVIATION=
(CASE STATE 
WHEN 'MAHARASHTRA' THEN 'MH'
WHEN 'ASSAM' THEN 'AS'
WHEN 'HIMACHAL%' THEN 'HP'
...
ELSE 
STATE
END
);

我从线程SQL - WHERE clause on each SET command in UPDATE?得到这个线索

问题是通配符字段未按预期运行。 State 列的值可能类似于“Himachal Pradesh”和“HimachalPradesh”。

我还搜索了https://community.oracle.com/thread/290198,其中一个答案使用了“searched case”,效果很好。 ..

CASE 
(WHEN STATE LIKE 'ANDHRA%' THEN 'AP'
 WHEN STATE LIKE 'HIMACHAL%' THEN 'HP'
END

我们如何在 SWITCHED 案例风格中实现这一点? 我也试过了

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 - “缺少关键字”)。

【问题讨论】:

  • 这两种swich case表格不能混用。
  • @ibre5041 在CASE表达式中使用=LIKE操作符没有问题
  • @LalitKumarB,下面提到的解决方案与我在问题中提到的community.oracle.com/thread/290198 中提到的解决方案相同。我在那里用 'LIKE' 代替运算符 '=' 没有问题。我的问题是我是否能够在上面的 switch case 样式中使用此类运算符,它通常与 'WHEN' ..'THEN' 组合一起使用,但不允许我使用引用状态的 'LIKE' 运算符。如果可行,请指出。
  • @LalitKumarB,换句话说,我想避免键入 WHEN STATE =' ' THEN ' ' 或 STATE LIKE ' ' THEN ' ' 一百次。似乎没有直接的解决方案。如果数据在整个过程中不一致(例如,喜马偕尔邦和喜马偕尔邦),我必须忍受它。你能帮忙解决这个问题吗?任何替代解决方法也可以帮助我。感谢您在下面的详细解释。
  • @Vvn 要在您的情况下使用不同的运算符使用多个条件,只有搜索到的情况才有效。

标签: sql oracle


【解决方案1】:

在所有情况下,您都必须使用搜索到的版本。

syntax diagram

【讨论】:

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
  • @Fildor 关键部分在上面的句子中。而且我不知道如何在答案中包含(我的努力)一个语法图。
  • @JensSchauder 您的答案是错误的,因为可以混合使用这两种操作。看我的回答。
  • @LalitKumarB 我注意到,您的回答与我的相反。但是我看不出我是如何误解语法图的。也许这是一个版本的事情?我链接到版本 10.2 的文档。你用的是哪个版本的?
  • @JensSchauder 您误解了搜索案例的语法。请参阅我之前关于stackoverflow.com/a/28558926/3989608 Serached 两种语法的解释的回答,这并不意味着您受限于运算符的使用。搜索案例表达式 infatc 使您可以灵活地从左到右检查多个条件,Oracle 使用短路评估。 OP 的问题不是混合这两种语法,而是使用两种不同的运算符,Oracle 允许这样做。在 OP 的情况下,只有搜索到的情况才有效。
【解决方案2】:

您可以在所有条件下使用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
);

【讨论】:

    【解决方案3】:

    在 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>
    

    案例陈述

    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>
    

    所以,更新成功。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-24
      • 2021-02-19
      相关资源
      最近更新 更多