복붙노트

[SQL] 오라클 SQL의 CASE .. 언제 표현

SQL

오라클 SQL의 CASE .. 언제 표현

나는 1 열이있는 테이블을 가지고 다음과 같은 데이터가

Status
a1
i
t
a2
a3

내 선택 쿼리에서 다음과 같은 결과를 표시 할

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

선택 쿼리에서 내가 생각할 수있는 한 가지 방법은 스위치를 사용하여 때 표현

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. ==============================

    1.당신은 IN 절을 사용할 수 있습니다

    당신은 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
    

    이 데모에서보세요

  2. ==============================

    2.물론이야...

    물론이야...

    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 바이올린입니다.

  3. ==============================

    3.당신은 CASE의 ELSE 조건을 사용하도록 다시 작성할 수 있습니다 :

    당신은 CASE의 ELSE 조건을 사용하도록 다시 작성할 수 있습니다 :

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

    4.디코딩을 사용하여이 작업을 수행하는 것이 더 쉬울 수 있습니다.

    디코딩을 사용하여이 작업을 수행하는 것이 더 쉬울 수 있습니다.

    SELECT
      status,
        decode ( status, 'a1','Active',
                         'a2','Active',
                         'a3','Active',
                         'i','Inactive',
                         't','Terminated',
                         'Default')STATUSTEXT
    FROM STATUS
    
  5. ==============================

    5.

    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;
    
  6. ==============================

    6.링크 된 오라클 케이스 상판에 대한 웹 검색 때문에, 나는 질문의 경우 표현에 대한 질문에 그래도 대답하지, 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;
    

    당 오라클 문서 : https://docs.oracle.com/cd/B10501_01/appdev.920/a96624/04_struc.htm

  7. ==============================

    7.당신은 상태의 첫 번째 문자를 확인할 수 있습니다. 이를 위해 당신은 문자열 함수를 사용합니다.

    당신은 상태의 첫 번째 문자를 확인할 수 있습니다. 이를 위해 당신은 문자열 함수를 사용합니다.

    SUBSTR (상태, 1,1)

    귀하의 경우 과거합니다.

  8. ==============================

    8.다음 구문은 작동합니다 :

    다음 구문은 작동합니다 :

    ....
    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
    )
    
  9. ==============================

    9.

    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
    
  10. from https://stackoverflow.com/questions/12650875/case-when-expression-in-oracle-sql by cc-by-sa and MIT license