86

1列のテーブルがあり、次のデータがあります

Status
a1
i
t
a2
a3

選択クエリに次の結果を表示したい

Status| STATUSTEXT
a1    | Active
i     | Inactive
t     | Terminated
a2    | Active
a3    | Active

私が考えることができる1つの方法は、selectクエリでSwitchWhen式を使用することでした。

SELECT
status,
CASE status 
WHEN 'a1' THEN 'Active'
WHEN 'a2' THEN 'Active'
WHEN 'a3' THEN 'Active'
WHEN 'i' THEN 'Inactive'
WHEN 't' THEN 'Terminated'
END AS StatusText
FROM stage.tst

アクティブステータスの式を3回、アクティブステータス全体を1つの式でチェックできる場合、これを記述する必要がない他の方法はありますか?

4

10 に答える 10

139

IN句を使用できます

何かのようなもの

SELECT
  status,
  CASE
    WHEN STATUS IN('a1','a2','a3')
    THEN 'Active'
    WHEN STATUS = 'i'
    THEN 'Inactive'
    WHEN STATUS = 't'
    THEN 'Terminated'
  END AS STATUSTEXT
FROM
  STATUS

このデモをご覧ください

SQLフィドルデモ

于 2012-09-29T07:46:25.733 に答える
19

もちろん...

select case substr(status,1,1) -- you're only interested in the first character.
            when 'a' then 'Active'
            when 'i' then 'Inactive'
            when 't' then 'Terminated'
       end as statustext
  from stage.tst

ただし、このスキーマにはいくつかの心配事があります。まず、何かを意味する列がある場合、最後に数字を追加することは必ずしも最善の方法ではありません。また、ステータスの数によっては、この列を別のテーブルへの外部キーに変換することを検討することもできます。


あなたのコメントに基づいて、あなたは間違いなくこれを外部キーに変えたいと思うでしょう。例えば

create table statuses ( -- Not a good table name :-)
    status varchar2(10)
  , description varchar2(10)
  , constraint pk_statuses primary key (status)
    )

create table tst (
    id number
  , status varchar2(10)
  , constraint pk_tst primary key (id)
  , constraint fk_tst foreign key (status) references statuses (status)
    )

クエリは次のようになります

select a.status, b.description
  from tst a
  left outer join statuses b
    on a.status = b.status

これがデモンストレーションするSQLフィドルです。

于 2012-09-29T07:43:05.663 に答える
18

CASE:のELSE条件を使用するように書き直すことができます 。

SELECT status,
       CASE status
         WHEN 'i' THEN 'Inactive'
         WHEN 't' THEN 'Terminated'
         ELSE 'Active'
       END AS StatusText
FROM   stage.tst 
于 2012-09-29T07:42:27.427 に答える
7

デコードを使用すると簡単になります。

SELECT
  status,
    decode ( status, 'a1','Active',
                     'a2','Active',
                     'a3','Active',
                     'i','Inactive',
                     't','Terminated',
                     'Default')STATUSTEXT
FROM STATUS
于 2017-10-06T09:45:42.627 に答える
2

Oracle caseそのリンクへのトップスのWeb検索なので、ここにcaseステートメントを追加しますが、caseについて尋ねられた質問には答えません。

CASE
   WHEN grade = 'A' THEN dbms_output.put_line('Excellent');
   WHEN grade = 'B' THEN dbms_output.put_line('Very Good');
   WHEN grade = 'C' THEN dbms_output.put_line('Good');
   WHEN grade = 'D' THEN dbms_output.put_line('Fair');
   WHEN grade = 'F' THEN dbms_output.put_line('Poor');
   ELSE dbms_output.put_line('No such grade');
END CASE;

または他のバリアント:

CASE grade
   WHEN 'A' THEN dbms_output.put_line('Excellent');
   WHEN 'B' THEN dbms_output.put_line('Very Good');
   WHEN 'C' THEN dbms_output.put_line('Good');
   WHEN 'D' THEN dbms_output.put_line('Fair');
   WHEN 'F' THEN dbms_output.put_line('Poor');
   ELSE dbms_output.put_line('No such grade');
END CASE;

Oracleドキュメントによる:https ://docs.oracle.com/cd/B10501_01/appdev.920/a96624/04_struc.htm

于 2019-06-17T12:26:07.223 に答える
1
SELECT
  STATUS,
  CASE
    WHEN STATUS IN('a1','a2','a3') 
     THEN 'Active'
    WHEN STATUS = 'i' 
     THEN 'Inactive'
    WHEN STATUS = 't'
     THEN 'Terminated'  ELSE null
  END AS STATUSTEXT
FROM
  stage.tst;
于 2017-11-16T09:43:31.700 に答える
0

ステータスの最初の文字のみを確認できます。このために、部分文字列関数を使用します。

substr(status、1,1)

あなたの場合は過去。

于 2012-09-29T07:52:46.007 に答える
0

次の構文が機能します:

....
where x.p_NBR =to_number(substr(y.k_str,11,5))
and x.q_nbr = 
 (case 
 when instr(substr(y.m_str,11,9),'_') = 6   then  to_number(substr(y.m_str,11,5))
 when instr(substr(y.m_str,11,9),'_') = 0   then  to_number(substr(y.m_str,11,9))
  else 
       1
  end
)
于 2013-11-08T14:29:03.030 に答える
0
CASE TO_CHAR(META.RHCONTRATOSFOLHA.CONTRATO)
WHEN '91' AND TO_CHAR(META.RHCONTRATOSFOLHA.UNIDADE) = '0001' THEN '91RJ'
WHEN '91' AND TO_CHAR(META.RHCONTRATOSFOLHA.UNIDADE) = '0002' THEN '91SP'
END CONTRATO,

00905. 00000 -  "missing keyword"
*Cause:    
*Action:
Erro na linha: 15 Coluna: 11
于 2019-01-26T13:24:39.260 に答える
0
DECODE(SUBSTR(STATUS,1,1),'a','Active','i','Inactive','t','Terminated','N/A')
于 2021-02-18T11:38:05.993 に答える