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:缺失关键字
发布于 2022-05-18 11:05:57
您可以使用UNION来实现案例的逻辑:
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;发布于 2022-05-18 11:38:25
正如lvaro González在一条评论中所说的那样,您不能使用一个案例表达式作为流控制操作符。您可以在where或on子句中使用case表达式,但只需使其生成一个值,然后将其与其他东西进行比较,这可能会很尴尬,所以通常最好不要使用。您通常可以用简单的布尔逻辑替换要实现的逻辑。
在本例中,您已经加入到table2,因此不需要您的子查询;您可以使用一个where子句来查看是否找到了匹配的记录--最好是检查ID以外的非空列,所以只有在valid_to_ts不可空的情况下,这个示例才能工作:
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进行比较。
https://stackoverflow.com/questions/72287879
复制相似问题