web-dev-qa-db-ja.com

CASE .. WHERE Oracle SQLでの式

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

Status
a1
i
t
a2
a3

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

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

私が考えることができる一つの方法は、select queryでSwitch When式を使っていた

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

私が書く必要がない場所でこれを行う他の方法はありますか Active Statusに対して式が3回の場合 そして、全体のアクティブステータスを1つの式で確認できますか?

65
Nilesh Barai

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 Fiddle DEMO

108
Adriaan Stander

もちろん...

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 Fiddle です。

15
Ben

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

SELECT status,
       CASE status
         WHEN 'i' THEN 'Inactive'
         WHEN 't' THEN 'Terminated'
         ELSE 'Active'
       END AS StatusText
FROM   stage.tst 
14
Sathyajith Bhat

decodeを使用する方が簡単です。

SELECT
  status,
    decode ( status, 'a1','Active',
                     'a2','Active',
                     'a3','Active',
                     'i','Inactive',
                     't','Terminated',
                     'Default')STATUSTEXT
FROM STATUS
4
Thunder
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;
1
praveen kumar
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
0
Vitor

次のような構文でうまくいきます。

....
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
)
0
Smart Coder

確認できるのはステータスの最初の文字だけです。これには部分文字列関数を使います。

substr(ステータス、1,1)

あなたの場合は過去です。

0
Timo Hahn