У меня есть таблица с 1 столбцом и имеет следующие данные
Status
a1
i
t
a2
a3
Я хочу показать следующий результат в моем запросе select
Status| STATUSTEXT
a1 | Active
i | Inactive
t | Terminated
a2 | Active
a3 | Active
Один из способов, который я мог подумать, - использовать выражение Switch When в select query
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 раза для активного состояния и весь активный статус можно проверить в одном единственное выражение?
Вы можете использовать предложение 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
Посмотрите на эту демонстрацию
Конечно...
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, чтобы продемонстрировать.
Вы можете переписать его, чтобы использовать условие ELSE CASE
:
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
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;
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
Следующий синтаксис будет работать:
....
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
)
Вы можете проверить только первый символ статуса. Для этого вы используете функцию подстроки.
substr (статус, 1,1)
В вашем случае прошлое.