组值:CASE 文本、ELSE 字段值

Wil*_*son 5 oracle case group-by oracle-12c

我有一张ROAD桌子:

+----+------------+
| ID | ROAD_CLASS |
+----+------------+
|  1 | ARTERIAL A |
|  2 | ARTERIAL B |
|  3 | ARTERIAL B |
|  4 | ARTERIAL C |
|  5 | ARTERIAL C |
|  6 | ARTERIAL C |
|  7 | COLLECTOR  |
|  8 | COLLECTOR  |
|  9 | LOCAL      |
| 10 | LOCAL      |
+----+------------+
Run Code Online (Sandbox Code Playgroud)

ROAD_CLASS字段的数据类型是NVARCHAR2.

我想创建一个视图,将所有主干道路分组到一个ARTERIAL类别中,但将其他道路类保留原样:

+------------+
| ROAD_CLASS |
+------------+
| ARTERIAL   |
| COLLECTOR  |
| LOCAL      |
+------------+
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

我试过的:

我已经成功完成了其中的一部分:

SELECT
      (CASE 
          WHEN ROAD_CLASS = 'ARTERIAL A' THEN 'ARTERIAL'
          WHEN ROAD_CLASS = 'ARTERIAL B' THEN 'ARTERIAL'
          WHEN ROAD_CLASS = 'ARTERIAL C' THEN 'ARTERIAL'
          --ELSE ROAD_CLASS
      END) AS ROAD_CLASS_GROUPED
FROM
    USER.ROAD
GROUP BY
      CASE 
          WHEN ROAD_CLASS = 'ARTERIAL A' THEN 'ARTERIAL'
          WHEN ROAD_CLASS = 'ARTERIAL B' THEN 'ARTERIAL'
          WHEN ROAD_CLASS = 'ARTERIAL C' THEN 'ARTERIAL'
      END

+--------------------+
| ROAD_CLASS_GROUPED |
+--------------------+
| null               |
| ARTERIAL           |
+--------------------+
Run Code Online (Sandbox Code Playgroud)

但是,null我想获取它们的字段值(COLLECTORLOCAL),而不是将其他道路类输出为。

当我尝试添加ELSE ROAD_CLASS到 CASE 语句时(如 SQL 注释中所示),ORA-12704: character set mismatch出现错误。

ste*_*fan 3

怎么样 ...

select distinct 
   (case
       when road_class in('ARTERIAL A','ARTERIAL B','ARTERIAL C') then n'ARTERIAL'
       else road_class
     end ) as ROAD_CLASS_GROUPED
from user.road;
Run Code Online (Sandbox Code Playgroud)

由于road_class列的数据类型是NVARCHAR,因此我们需要在字符串文字“ARTERIAL”前面写入N或n,以防止出现错误消息。(另请参阅: https: //docs.oracle.com/database/121/SQLRF/sql_elements003.htm#SQLRF00218