Oracle中FROM子句内的CASE [已关闭]

jgzswidk  于 2023-04-20  发布在  Oracle
关注(0)|答案(2)|浏览(170)

**已关闭。**此问题为not reproducible or was caused by typos。当前不接受答案。

这个问题是由一个错字或一个无法再复制的问题引起的。虽然类似的问题可能是on-topic在这里,但这个问题的解决方式不太可能帮助未来的读者。
6天前关闭。
Improve this question
我写了一个SQL查询,从employee、assignment、payment、emp_period和assignment_master表中获取员工的名字、姓氏描述。下面是我的SQL查询:

Select e.first_name,e.Last_name,a.description,p.paycode,am.leave_code
from employee e, assignment a, payment p
left outer join  assignment_master am on p.paycode= case when ascii(am.leave_code) is null then N'184645' else am.leave_code end 
and p.start_date='13/02/2021',
emp_period ep;

当我在Oracle中运行这个时,我得到一个错误ORA-00905: 'Missing Keyword'。我发现Case不能在From子句中使用,有人知道我如何在select中使用这个CASE并获得相同的reselt吗?

qcuzuvrc

qcuzuvrc1#

这是相当困难的,因为你没有张贴这些表之间的关系,所以我只是猜测,但是-这就是你的查询应该看起来像。

select e.first_name, e.last_name, a.description, p.paycode, am.leave_code
from employee e join assignment a         on a.employee_id   = e.employee_id
                join payment p            on p.assignment_id = a.assignment_id
                join emp_period ep        on ep.employee_id  = e.employee_id
           left join assignment_master am on p.paycode       = coalesce(ascii(am.leave_code), N'184645')
where p.start_date = date '2021-02-13';

基本上,连接表的列彼此相关。对于CASE,你可以使用它,但你发布的那个可以简化为coalesce。对于date值(假设start_Date列的数据类型是date),不要将它与sting比较,而是与date比较(要么是date文字,就像我做的那样,要么使用具有适当格式模型的to_date函数)。

  • 缺少关键字 * 可能也与代码的这一部分相关:
and p.start_date='13/02/2021',    --> comma, and ..
emp_period ep;                    --> ... then yet another table

切换到JOIN s,不要混合使用两个选项(from子句中的逗号分隔表列表,where子句中的joins-将其留给 conditions)。
如果你把它们混合在一起,你可能会得到一个错误,即使 * 一切 * 看起来都很好:

SQL> select count(*)
  2  from emp e, dept d left join bonus b on b.ename = e.ename
  3  where d.deptno = e.deptno;
from emp e, dept d left join bonus b on b.ename = e.ename
                                                  *
ERROR at line 2:
ORA-00904: "E"."ENAME": invalid identifier

正确连接:

SQL> select count(*)
  2  from emp e join dept d on d.deptno = e.deptno
  3        left join bonus b on b.ename = e.ename;

  COUNT(*)
----------
        14

SQL>
ovfsdjhp

ovfsdjhp2#

您没有收到case when的错误,而是收到N'184645'的错误。请改用CAST('184645 ' AS NCHAR(6))。Oracle支持case when条件。

Select e.first_name,e.Last_name,a.description,p.paycode,am.leave_code
from employee e, assignment a, payment p
left outer join  assignment_master am on p.paycode= case when ascii(am.leave_code) is null then CAST('184645' AS NCHAR(6)) else am.leave_code end 
and p.start_date='13/02/2021',
emp_period ep;

如果条件是am.leave_code is null,则可以使用NVL()完成

Select e.first_name,e.Last_name,a.description,p.paycode,am.leave_code
from employee e, assignment a, payment p
left outer join  assignment_master am on p.paycode= NVL(am.leave_code,N'184645') 
and p.start_date='13/02/2021',
emp_period ep;

相关问题