86

我有 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 次,并且可以在一个表达式中检查整个活动状态?

4

10 回答 10

139

你可以使用一个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 小提琴演示

于 2012-09-29T07:46:25.733 回答
19

当然...

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 。

于 2012-09-29T07:43:05.663 回答
18

您可以重写它以使用 a 的 ELSE 条件 CASE

SELECT status,
       CASE status
         WHEN 'i' THEN 'Inactive'
         WHEN 't' THEN 'Terminated'
         ELSE 'Active'
       END AS StatusText
FROM   stage.tst 
于 2012-09-29T07:42:27.427 回答
7

使用decode会更容易。

SELECT
  status,
    decode ( status, 'a1','Active',
                     'a2','Active',
                     'a3','Active',
                     'i','Inactive',
                     't','Terminated',
                     'Default')STATUSTEXT
FROM STATUS
于 2017-10-06T09:45:42.627 回答
2

由于网络搜索Oracle case在该链接的顶部,我在此处添加了 case语句,但没有回答有关 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

于 2019-06-17T12:26:07.223 回答
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;
于 2017-11-16T09:43:31.700 回答
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
)
于 2013-11-08T14:29:03.030 回答
0

您只能检查状态的第一个字符。为此,您使用 substring 函数。

substr(状态,1,1)

在你过去的情况下。

于 2012-09-29T07:52:46.007 回答
0
DECODE(SUBSTR(STATUS,1,1),'a','Active','i','Inactive','t','Terminated','N/A')
于 2021-02-18T11:38:05.993 回答
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
于 2019-01-26T13:24:39.260 回答