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如何在CASE WHEN ELSE语句中使用select语句?