sql—在使用join in语句时,在select语句中使用case表达式时出错

h6my8fg2  于 2021-07-27  发布在  Java
关注(0)|答案(3)|浏览(300)

此代码不工作,显示错误“from keyword not found where expected”

select m.marks,
CASE 
WHEN m.marks<65 then 'F' 
WHEN m.marks>65 then 'P' 
END m.grade 
from student s INNER JOIN marks m ON s.id=m.id;

但这是有效的

select marks, 
CASE 
WHEN marks<65 then 'F' 
WHEN marks>65 then 'P' 
END grade 
from marks
sy5wg1nm

sy5wg1nm1#

这个 m 是的别名 marks 表中的列时使用。将其应用于列别名:

END m.grade

在它不属于的地方,所以-只在那个地方-移除 m. :

select m.marks,
CASE 
WHEN m.marks<65 then 'F' 
WHEN m.marks>65 then 'P' 
END grade 
from student s INNER JOIN marks m ON s.id=m.id;

正如@gordon在评论中指出的,你检查的是>65和<65,因此一个正好65的学生不会得到f或p,他们的分数将为空。你可能想要:

WHEN m.marks < 65 then 'F' 
WHEN m.marks >= 65 then 'P'

WHEN m.marks >= 65 then 'P' 
ELSE 'F'

... 尽管如果 marks 如果为null,则第二个版本也会将其视为f,而第一个版本仍将返回null。

cedebl8k

cedebl8k2#

不能将列值用作列别名

Select 1 AS Alias_1,
CASE 
WHEN 1=1 THEN 1
WHEN 2=2 THEN 2
END AS Alias_2_AnyName
from dual d;

如果你使用

Select 1 AS Alias_1,
CASE 
WHEN 1=1 THEN 1
WHEN 2=2 THEN 2
END AS d.value
from dual d;

oracle希望在您的case块结束后有一个别名,但是您正在添加另一个列值(因为可以省略key)

2jcobegt

2jcobegt3#

m.grade 是问题,应该是公正的 grade 因为它是一个别名

select m.marks,
CASE 
WHEN m.marks<65 then 'F' 
WHEN m.marks>65 then 'P' 
END grade 
from student s INNER JOIN marks m ON s.id=m.id;

相关问题