CASE 表达式可以实现类似“IF…ELSE…THEN”的逻辑而不用调用子程序。CASE 表达式有两种使用方法,简单的和带搜索条件的。

    • 示例:在查询中使用简单的 CASE 表达式,将国家代码缩写翻译为全称。
    1. obclient> CREATE TABLE t_case(id number NOT NULL PRIMARY KEY, abbr varchar(5));
    2. Query OK, 0 rows affected (0.08 sec)
    3. obclient> INSERT INTO t_case(id, abbr) VALUES (1,'US'),(2,'UK'),(3,'CN'),(4,'JP');
    4. Query OK, 4 rows affected (0.02 sec)
    5. Records: 4 Duplicates: 0 Warnings: 0
    6. obclient>
    7. obclient> SELECT id, abbr,
    8. CASE abbr
    9. WHEN 'US' THEN 'America'
    10. WHEN 'UK' THEN 'English'
    11. WHEN 'CN' THEN 'China'
    12. ELSE 'UNKOWN'
    13. END full_name
    14. FROM t_case ;
    15. +----+------+-----------+
    16. | id | abbr | full_name |
    17. +----+------+-----------+
    18. | 1 | US | America |
    19. | 2 | UK | English |
    20. | 3 | CN | China |
    21. | 4 | JP | UNKOWN |
    22. +----+------+-----------+
    23. 4 rows in set (0.00 sec)
    24. obclient>
    • 示例:在查询中使用带搜索条件的 CASE 表达式
    1. obclient> DROP TABLE IF EXISTS t_case2;
    2. Query OK, 0 rows affected (0.02 sec)
    3. obclient> CREATE TABLE t_case2(id number NOT NULL PRIMARY KEY, c_date date );
    4. Query OK, 0 rows affected (0.14 sec)
    5. obclient> INSERT INTO t_case2(id,c_date)
    6. VALUES (1,'2019-03-01')
    7. ,(2,'2019-05-08')
    8. ,(3,'2019-07-07')
    9. ,(4,'2019-10-11')
    10. ,(5,'2019-12-12')
    11. ,(6,'2020-01-05');
    12. Query OK, 6 rows affected (0.01 sec)
    13. Records: 6 Duplicates: 0 Warnings: 0
    14. obclient>
    15. obclient> SELECT id, c_date,
    16. CASE
    17. WHEN datediff(now(), c_date) > 12*30 THEN 'More than one year ago'
    18. WHEN datediff(now(), c_date) > 9*30 THEN 'More than three quarters ago'
    19. WHEN datediff(now(), c_date) > 6*30 THEN 'More than half a year ago'
    20. WHEN datediff(now(), c_date) > 3*30 THEN 'More than a quarter ago'
    21. WHEN datediff(now(), c_date) >= 0 THEN 'Within a quarter'
    22. ELSE 'Illegal'
    23. END "Duration"
    24. FROM t_case2;
    25. +----+------------+------------------------------+
    26. | id | c_date | Duration |
    27. +----+------------+------------------------------+
    28. | 1 | 2019-03-01 | More than one year ago |
    29. | 2 | 2019-05-08 | More than three quarters ago |
    30. | 3 | 2019-07-07 | More than three quarters ago |
    31. | 4 | 2019-10-11 | More than a quarter ago |
    32. | 5 | 2019-12-12 | More than a quarter ago |
    33. | 6 | 2020-01-05 | Within a quarter |
    34. +----+------------+------------------------------+
    35. 6 rows in set (0.01 sec)