oracle如何在CASE WHEN ELSE语句中使用select语句?

Posted

技术标签:

【中文标题】oracle如何在CASE WHEN ELSE语句中使用select语句?【英文标题】:How to use select statement in CASE WHEN ELSE statement in oracle? 【发布时间】:2015-05-06 11:34:12 【问题描述】:

我有一张表USER,内容如下:

 USER_ID   User_Name   City   zip   PR_USER_ID
--------- ----------- ------ ----- ------------
 101       AAA         PPP    123   101
 102       BBB         QQQ    345   101
 103       CCC         RRR    567   NULL
 104       FFF         SSS    789   102

我需要在过程中添加一个查询来显示User_Name

CASE WHEN PR_USER_ID IS NULL
     THEN 'NO_PR_USER'   
     ELSE ... get the `User_Name`
              corressponding to USER.USERID = USER.PR_USER_ID

如我所愿:

SELECT
  CASE
    WHEN USR.PR_USER_ID IS NULL THEN 'NO PR_USER' 
    ELSE (
      SELECT USR.NAME
      FROM USER USR
      WHERE USR.USER_ID = USR.PR_USR_ID
    ) PRIMARY_USER_NAME
  END 

使用这个查询我得到USER_NAME

SELECT
  PRIMARY_USER.NAME AS PRIMARY_USER_NAME
FROM USER SECONDARY_USER
INNER JOIN USER PRIMARY_USER ON PRIMARY_USER.USER_id = SECONDARY_USER.PR_USER_ID; 

但我需要这样的输出:

  PR_USER_ID   PRIMARY_USER_NAME
 ------------ -------------------
  101          AAA
  101          AAA
  NULL         No_PR_USER
  102          BBB

如何以CASE WHEN ELSE 语句或任何其他方式获取我的结果?

请举个例子。

【问题讨论】:

您是否同时使用 mysql 和 Oracle? (不要标记未涉及的产品...) 我只使用Oracle11g 【参考方案1】:

您应该使用(左)外连接来解决这种情况。 NVL/COALESCE 将负责用一些硬编码值替换 NULL。 类似的东西:

SELECT T...., T...., NVL(USR.NAME, 'NO PR_USER' )
FROM USER T
LEFT JOIN USER USR
ON USR.USER_ID=T.PR_USER_ID

【讨论】:

【参考方案2】:

请检查它是否适合您。select user_id,case when pr_user_id IS NOT NULL then user_name else 'NO PR_USER' end as primary_user_name from user_name;

它显示以下结果

【讨论】:

但我需要这样的输出:PR_USER_ID PRIMARY_USER_NAME 101 AAA 101 AAA NULL No_PR_USER 102 BBB 能否以表格格式提供给我,因为我无法更正您的输出?【参考方案3】:

您好,请尝试以下查询。

select decode(pr_user_id,null,null,user_id),case  when pr_user_id IS NOT NULL then user_name
             else 'NO PR_USER'
             end as primary_user_name
from test_2;
101     AAA
102     BBB
null    NO PR_USER
104     FFF

【讨论】:

【参考方案4】:

您可以尝试以下查询:-

SELECT CASE WHEN USR.PR_USER_ID IS NULL THEN 'NO PR_USER' 
ELSE USR.NAME END AS PRIMARY_USER_NAME 
FROM USER USR 
WHERE USR.USER_ID=USR.PR_USR_ID;

【讨论】:

以上是关于oracle如何在CASE WHEN ELSE语句中使用select语句?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle CASE WHEN 用法介绍

oracle中的条件语句

sql语句借助case when实现自动拼装where条件

oracle语句中when条件接不存在怎么写

SQL语句case怎么判断这个字段为空

case when用法