CASE .. КОГДА выражение в Oracle SQL

62

У меня есть таблица с 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 раза для активного состояния и весь активный статус можно проверить в одном единственное выражение?

Теги:
oracle10g

8 ответов

95
Лучший ответ

Вы можете использовать предложение 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 Fiddle DEMO

  • 0
    Если можно, я предлагаю явно добавить ELSE «НЕИЗВЕСТНО - ПОЖАЛУЙСТА, ПОЗВОНИТЕ НАМ» или какой-либо другой такой флаг. В больших системах данных с большим количеством пользователей иногда в данные попадают новые значения, и может быть полезно убедить пользователей заметить и связаться с вами. Я считаю, что без этого поле «STATUSTEXT» будет просто пустым, что приведет к меньшему количеству комментариев пользователей. +1 Адриану за хороший отступ тоже.
15

Конечно...

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, чтобы продемонстрировать.

  • 0
    Я привел общий пример для моего дела. Однако меня не интересует только первый персонаж.
  • 0
    @NileshBarai, я обновил свой ответ.
Показать ещё 1 комментарий
14

Вы можете переписать его, чтобы использовать условие ELSE CASE:

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

Легче будет использовать декодировать.

SELECT
  status,
    decode ( status, 'a1','Active',
                     'a2','Active',
                     'a3','Active',
                     'i','Inactive',
                     't','Terminated',
                     'Default')STATUSTEXT
FROM STATUS
1
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;
  • 0
    Хотя этот фрагмент кода приветствуется и может оказать некоторую помощь, он будет значительно улучшен, если в него будет включено объяснение того, как он решает этот вопрос. Без этого ваш ответ имеет гораздо меньшую образовательную ценность - помните, что вы отвечаете на вопрос для читателей в будущем, а не только для того, кто спрашивает сейчас! Пожалуйста, отредактируйте свой ответ, чтобы добавить объяснение и указать, какие ограничения и предположения применяются
0
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
  • 1
    Пожалуйста, объясните, как это отвечает на 8-летний вопрос.
0

Следующий синтаксис будет работать:

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

Вы можете проверить только первый символ статуса. Для этого вы используете функцию подстроки.

substr (статус, 1,1)

В вашем случае прошлое.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню