bestsource

케이스 .. Oracle SQL 표현시

bestsource 2023. 3. 20. 23:22
반응형

케이스 .. Oracle SQL 표현시

나는 1개의 컬럼이 있는 테이블을 가지고 있고 다음과 같은 데이터를 가지고 있다.

Status
a1
i
t
a2
a3

선택한 쿼리에 다음 결과를 표시하려고 합니다.

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

select 쿼리에서 식을 사용할 때 스위치를 사용하는 것이 한 가지 방법이라고 생각할 수 있습니다.

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회, 전체 활성 상태를 하나의 표현으로 확인할 수 있는 경우]라고 쓸 필요가 없는 다른 방법이 있습니까?

를 사용할 수 있습니다.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 바이올린 데모

물론...

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 Fidle을 시연해 보겠습니다.

의 ELSE 조건을 사용하도록 다시 쓸 수 있습니다.

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

디코딩을 사용하는 것이 더 쉬워집니다.

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

웹 검색 이후Oracle 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

다음 구문이 작동합니다.

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

당신 과거의 경우.

DECODE(SUBSTR(STATUS,1,1),'a','Active','i','Inactive','t','Terminated','N/A')

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

반응형