web-dev-qa-db-ja.com

グループ値:CASEテキスト、ELSEフィールド値

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

ROAD_CLASSフィールドのデータ型はNVARCHAR2です。

すべての幹線道路を1つのARTERIALカテゴリにグループ化するビューを作成しますが、他の道路クラスはそのままにしておきます。

+------------+
| ROAD_CLASS |
+------------+
| ARTERIAL   |
| COLLECTOR  |
| LOCAL      |
+------------+

これどうやってするの?

私が試したこと:

私はそれの一部を成功させました:

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

ただし、他の道路クラスをnullとして出力する代わりに、それらのフィールド値(COLLECTORおよびLOCAL)を取得します。

CASEステートメントにELSE ROAD_CLASSを追加しようとすると(SQLコメントに示されているように)、ORA-12704: character set mismatchエラーが発生します。

5
Wilson

どう...

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;

列road_classのデータ型がNVARCHARであるため、エラーメッセージを防ぐために、文字列リテラル 'ARTERIAL'の前にNまたはnを書き込む必要があります。 (参照: https://docs.Oracle.com/database/121/SQLRF/sql_elements003.htm#SQLRF00218

3
stefan