首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取错误- ORA-00905:缺少关键字

获取错误- ORA-00905:缺少关键字
EN

Stack Overflow用户
提问于 2022-05-18 10:55:12
回答 2查看 40关注 0票数 0
代码语言:javascript
复制
Select * from table1 t1 left outer join table2 t2 on t1.id=t2.id and 
case 
when t1.id in (select t2.id from table2)
then t1.valid_to_ts > sysdate and t2.valid_to_ts>sysdate
else
t1.valid_to_ts>sysdate.

出错了-

ORA-00905:缺失关键字

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-05-18 11:05:57

您可以使用UNION来实现案例的逻辑:

代码语言:javascript
复制
SELECT *
  FROM table1 t1 LEFT JOIN table2 t2 ON t1.id = t2.id
 WHERE t2.id IS NULL
   AND t1.valid_to_ts > SYSDATE
 UNION ALL
SELECT *
  FROM table1 t1 LEFT JOIN table2 t2 ON t1.id = t2.id
 WHERE t1.id IS NOT NULL
   AND t1.valid_to_ts > SYSDATE
   AND t2.valid_to_ts > SYSDATE;
票数 0
EN

Stack Overflow用户

发布于 2022-05-18 11:38:25

正如lvaro González在一条评论中所说的那样,您不能使用一个案例表达式作为流控制操作符。您可以在whereon子句中使用case表达式,但只需使其生成一个值,然后将其与其他东西进行比较,这可能会很尴尬,所以通常最好不要使用。您通常可以用简单的布尔逻辑替换要实现的逻辑。

在本例中,您已经加入到table2,因此不需要您的子查询;您可以使用一个where子句来查看是否找到了匹配的记录--最好是检查ID以外的非空列,所以只有在valid_to_ts不可空的情况下,这个示例才能工作:

代码语言:javascript
复制
select * from table1 t1
left outer join table2 t2
on t1.id = t2.id
where t1.valid_to_ts > sysdate
and (t2.valid_to_ts is null or t2.valid_to_ts > sysdate)

如果t2.valid_to_ts是可空的,那么您应该使用不同的非空列;除非您希望包含无效的值--到目前为止--但是您没有为t1.valid_to_ts这样做。

如果您试图在on子句中检查这一点,那么您将不会筛选出table2中确实存在但日期较早的in。

db<>fiddle,包括一个获得错误结果的on子句版本(据我所知,至少从您的开始查询中可以看出)。

在演示中,我假设_ts列是日期,因为您正在与sysdate进行比较;如果它们实际上是时间戳(如后缀所示),则可以与systimestamp进行比较。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72287879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档