CASE .. WHES中的表达式

Nil*_*rai 68 sql oracle oracle10g

我有1列的表,并有以下数据

Status
a1
i
t
a2
a3
Run Code Online (Sandbox Code Playgroud)

我想在我的选择查询中显示以下结果

Status| STATUSTEXT
a1    | Active
i     | Inactive
t     | Terminated
a2    | Active
a3    | Active
Run Code Online (Sandbox Code Playgroud)

我能想到的一种方法是在select查询中使用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
Run Code Online (Sandbox Code Playgroud)

有没有其他方法可以做到这一点,我不需要写入当表达3次活动状态,并且可以在一个表达式中检查整个活动状态?

Adr*_*der 115

你可以使用一个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
Run Code Online (Sandbox Code Playgroud)

看看这个演示

SQL Fiddle DEMO

  • 如果可以,我建议明确添加 ELSE 'UNKNOWN - PLEASE CALL US' 或其他一些此类标志。在拥有众多用户的大型数据系统中,有时新值会渗入数据中,促使用户注意并与您联系会很有帮助。我相信没有这个,“STATUSTEXT”字段将是空白的,这会产生更少的用户评论。+1 Adriaan 的缩进也很好。 (2认同)

Sat*_*hat 16

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

SELECT status,
       CASE status
         WHEN 'i' THEN 'Inactive'
         WHEN 't' THEN 'Terminated'
         ELSE 'Active'
       END AS StatusText
FROM   stage.tst 
Run Code Online (Sandbox Code Playgroud)


Ben*_*Ben 16

当然...

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
Run Code Online (Sandbox Code Playgroud)

但是,这个架构有一些令人担忧的事情.首先,如果你有一个意味着什么的专栏,那么在最后添加一个数字并不一定是最好的方法.此外,根据您所拥有的状态数,您可能需要考虑将此列转换为单独表的外键.


根据您的评论,您肯定希望将其转换为外键.例如

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)
    )
Run Code Online (Sandbox Code Playgroud)

然后您的查询成为

select a.status, b.description
  from tst a
  left outer join statuses b
    on a.status = b.status
Run Code Online (Sandbox Code Playgroud)

这是一个演示的SQL小提琴.


Thu*_*der 5

使用解码会更容易。

SELECT
  status,
    decode ( status, 'a1','Active',
                     'a2','Active',
                     'a3','Active',
                     'i','Inactive',
                     't','Terminated',
                     'Default')STATUSTEXT
FROM STATUS
Run Code Online (Sandbox Code Playgroud)