developer tip

CASE .. Oracle SQL의 WHEN 표현식

copycodes 2020. 11. 10. 08:20
반응형

CASE .. Oracle SQL의 WHEN 표현식


1 열이있는 테이블이 있고 다음 데이터가 있습니다.

Status
a1
i
t
a2
a3

선택 쿼리에 다음 결과를 표시하고 싶습니다.

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

내가 생각할 수있는 한 가지 방법은 선택 쿼리에서 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에 대해 When 표현식을 3 번 쓸 필요가없고 전체 활성 상태를 하나의 표현식으로 확인할 수있는 다른 방법이 있습니까?


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 바이올린 데모


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

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

물론이야...

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 이 있습니다.


디코드를 사용하는 것이 더 쉬울 것 입니다.

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

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;

상태의 첫 번째 문자 만 확인할 수 있습니다. 이를 위해 하위 문자열 기능을 사용합니다.

substr (상태, 1,1)

과거의 경우.


다음 구문이 작동합니다.

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

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

Since web search for Oracle case tops to that link, I add here for case statement, though not answer to the question asked about case expression:

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;

or other variant:

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;

Per Oracle docs: https://docs.oracle.com/cd/B10501_01/appdev.920/a96624/04_struc.htm

참고URL : https://stackoverflow.com/questions/12650875/case-when-expression-in-oracle-sql

반응형