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
'developer tip' 카테고리의 다른 글
컬렉션에서 목록으로 가장 빠르게 변환 (0) | 2020.11.10 |
---|---|
벡터에 NA가 1 개 이상 있는지 감지하는 가장 빠른 방법은 무엇입니까? (0) | 2020.11.10 |
Google Developers Console에서 프로젝트를 삭제하는 방법 (0) | 2020.11.10 |
Angular2에서 원시 HTML을 바인딩하는 방법 (0) | 2020.11.10 |
Java에서 명명 규칙 'of'는 무엇을 의미합니까? (0) | 2020.11.10 |