Oracle:在操作中使用 CASE 语句变量

Posted

技术标签:

【中文标题】Oracle:在操作中使用 CASE 语句变量【英文标题】:Oracle: Using CASE statement variable in an operation 【发布时间】:2018-11-01 16:28:01 【问题描述】:

我有以下 SQL 查询:

SELECT PLAYER_ID, 
       PLAYER_CD, 
       TEAM_ID, 
       USR_FNM, 
       USR_MNM, 
       USR_LNM,
       CASE 
           WHEN TEAM_ID = '11111111111111' THEN SIGN_DT
           ELSE START_DT
       END AS ASGN_DT
FROM PLAYER P 
JOIN TEAM T ON P.PLAYER_TEAM_ID = T.TEAM_ID 
JOIN USR U ON P.PLYAER_USR_ID = USR_ID;

我正在尝试将以下字段添加到 SELECT 查询中,以获取从使用 CASE 语句检索到的日期到现在的天数:

(TRUNC(SYSDATE) - TRUNC(ASGN_DT))

但是当我这样做时,我得到了这个错误:

ORA-00904:“ASGN_DT”:标识符无效

【问题讨论】:

【参考方案1】:

不要trunc 别名ASGN_DT,而是case 代替

 CASE 
       WHEN TEAM_ID = '11111111111111' THEN SIGN_DT
       ELSE START_DT
   END 

您还可以将较长的 case 语句替换为较短的 decode 函数:

 decode(TEAM_ID, '11111111111111', SIGN_DT, START_DT)

【讨论】:

无论哪种方式都显示相同的错误。我需要一种在减法运算中使用ASGN_DT 的方法。 使用trunc(sysdate-decode(TEAM_ID, '11111111111111', SIGN_DT, START_DT)显示错误 ORA-00932: inconsistent datatypes: expected NUMBER got INTERVAL DAY TO SECOND【参考方案2】:

ASGN_DT 是您将在结果集中看到的最终别名,但从查询本身看不到它。

解决方案?将您的查询包装为子查询。对于外部查询,ASGN_DT 列将可见。例如:

select
    *,
    (TRUNC(SYSDATE) - TRUNC(ASGN_DT)) as diff
from (
  SELECT PLAYER_ID, 
         PLAYER_CD, 
         TEAM_ID, 
         USR_FNM, 
         USR_MNM, 
         USR_LNM,
         CASE 
             WHEN TEAM_ID = '11111111111111' THEN SIGN_DT
             ELSE START_DT
         END AS ASGN_DT
  FROM PLAYER P 
  JOIN TEAM T ON P.PLAYER_TEAM_ID = T.TEAM_ID 
  JOIN USR U ON P.PLYAER_USR_ID = USR_ID
) x;

您也可以使用 CTE(通用表表达式)。

【讨论】:

使用星号会初始化这个错误:ORA-00923: FROM keyword not found where expected【参考方案3】:

我在我的联接中使用了一个子查询,如下所示,以实现我想要做的事情。

SELECT PLAYER_ID, 
       PLAYER_CD, 
       TEAM_ID, 
       USR_FNM, 
       USR_MNM, 
       USR_LNM,
       ASGN_DT
FROM PLAYER P 
JOIN (SELECT
    CASE 
        WHEN TEAM_ID = '11111111111111' THEN SIGN_DT
        ELSE START_DT
    END AS ASGN_DT
    FROM TEAM T) T ON P.PLAYER_TEAM_ID = T.TEAM_ID 
JOIN USR U ON P.PLYAER_USR_ID = USR_ID;

【讨论】:

以上是关于Oracle:在操作中使用 CASE 语句变量的主要内容,如果未能解决你的问题,请参考以下文章

在 oracle 的另一个 case 语句中使用 case 语句的结果

Oracle:在 Where 子句中使用 Case 语句

Oracle 在 case 语句和插入中使用引号的区别

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

在 oracle 中的 case 或 decode 语句中使用 sum

在 Case 语句中使用计算 - Oracle SQL