UNPIVOTで格納される値を日本語にする【Oracle】

以下のテーブルがある。
JOBROUTE テーブル

id STATION CAR TRAIN WALK
1 新宿 5 12 120
2 渋谷 7 18 130

このCAR, TRAIN, WALK 列をUNPIVOTする。

SELECT 
     id, STATION, M_TYPE, T_MINUTES
FROM JOBROUTE 
UNPIVOT(T_MINUTES FOR M_TYPE IN(CAR , TRAIN , WALK))

結果

id STATION M_TYPE T_MINUTES
1 新宿 CAR 5
1 新宿 TRAIN 12
1 新宿 WALK 120
2 渋谷 CAR 7
2 渋谷 TRAIN 18
2 渋谷 WALK 130

UNPIVOT で作成される列名を日本語にしたい。
CAR ⇒ 車
TRAIN ⇒ 電車
WALK ⇒ 徒歩
というように。。。

安全で確実な方法は、SELECT句でCASE文を書く方法

SELECT 
      id
     ,STATION
     ,CASE M_TYPE
          WHEN 'CAR' THEN ''
          WHEN 'TRAIN' THEN '電車'
          WHEN 'WALK' THEN '徒歩'
      END AS M_TYPE
     ,T_MINUTES
FROM JOBROUTE 
UNPIVOT(T_MINUTES FOR M_TYPE IN(CAR , TRAIN , WALK))

SELECTでCASE式を避ける方法、一旦サブクエリになってしまうが、

WITH TJOBROUTE AS (
    SELECT 
      id
     ,STATION
     ,CAR       AS ""
     ,TRAIN     AS "電車"
     ,WALK      AS "徒歩"
     ,T_MINUTES
FROM JOBROUTE 
)
SELECT 
      id
     ,STATION
     ,M_TYPE
     ,T_MINUTES
FROM TJOBROUTE 
UNPIVOT(T_MINUTES FOR M_TYPE IN("", "電車", "徒歩"))

ここで、注意しなければならないのは、
Oracle は、AS 句で日本語など2バイト文字を使う場合は、シングルクォートではなく、
ダブルクォーテーションを使うことである。

id STATION M_TYPE T_MINUTES
1 新宿 5
1 新宿 電車 12
1 新宿 徒歩 120
2 渋谷 7
2 渋谷 電車 18
2 渋谷 徒歩 130


Oracle UNPIVOT で注意すべき点
NULLの値の列は、デフォルトでは、行に変換されず無視される。
したがって、NULLでも行を作成したければ、INCLUDE NULLS を指定しなければならない。

WITH TJOBROUTE AS (
    SELECT 
      id
     ,STATION
     ,CAR       AS ""
     ,TRAIN     AS "電車"
     ,WALK      AS "徒歩"
     ,T_MINUTES
FROM JOBROUTE 
)
SELECT 
      id
     ,STATION
     ,M_TYPE
     ,T_MINUTES
FROM TJOBROUTE 
UNPIVOT INCLUDE NULLS (T_MINUTES FOR M_TYPE IN("", "電車", "徒歩"))

PostgreSQL は NULLでも処理してくれるのでこの include nulls の指定は必要がない。