来自错误位置的关键字

时间:2019-04-18 03:28:40

标签: sql oracle

显示房地产经纪人的员工编号,姓名,年薪(年薪),月薪(月薪)和年龄(年龄)。将月薪四舍五入到小数点后两位。圆岁到岁。按员工年龄递减排序输出。如果记录上没有生日,则将年龄列为“未知”。 这是我必须回答的代码。

select st_staffno, st_name, st_salary "Annual Salary",(st_salary/12) as "Monthly Salary"   
    decode (st_birthdate, null, 'unknown'), 
    round sysdate ((st.birthdate)/365.25,0) as "Age"
from staff
order by "Age" desc;

它在未找到预期错误的地方返回From关键字。

2 个答案:

答案 0 :(得分:2)

您应该使用正在使用的DBMS标记SQL问题。根据{{​​1}},我得出结论是Oracle。当查询解析器认为DECODE子句已完成,但没有ORA-00923 "FROM keyword not found where expected"关键字时,您将得到SELECT。那么,什么使DBMS认为FROM子句已结束?当您在所选表达式之间缺少逗号时,通常会发生这种情况。

您的错误:

  1. SELECT之后缺少逗号。
  2. 您的年龄计算在语法上不正确。
  3. 您正在使用as "Monthly Salary",但查询中没有st.birthdate表名或别名。我想列名是st

更正的查询:

st_birthdate

您也可以使用标准SQL的select st_staffno, st_name, st_salary as "Annual Salary", st_salary / 12 as "Monthly Salary" decode(st_birthdate, null, 'unknown'), round((sysdate - st_birthdate) / 365.25, 0) as "Age" from staff order by "Age" desc; 代替DECODE。要从字面上应用“然后将年龄设为未知”,您必须将最后两个表达式结合起来。而且您错过了“将月薪四舍五入到小数点后两位”。

CASE WHEN

最后:我们通常不根据实际的实际时间来计算年龄。在4月1日出生的时候,我们在4月1日午夜每岁大一点。

select
  st_staffno,
  st_name,
  st_salary as "Annual Salary",
  round(st_salary / 12, 2) as "Monthly Salary"   
  case when st_birthdate is null
       then 'unknown'
       else to_char(round((sysdate - st_birthdate) / 365.25, 0))
  end as "Age"
from staff
order by st_birthdate nulls last;

答案 1 :(得分:0)

回合结束后,您只需要在(后面加上括号即可,因为回合的功能类似于

.. round(sysdate/362.25,0)并检查用于评估Age列的逻辑,它应该是..decode(birthdate,round(sysdate..ontrue),null (onfalse)之类的解码条件