0

此代码不起作用并显示错误“未在预期的位置找到来自关键字”

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
4

3 回答 3

1

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。

于 2020-07-30T07:35:52.163 回答
0

您不能将列值用作列别名

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 在您的案例块结束后期待别名,但您正在添加另一个列值(因为键可以省略)

于 2020-07-30T07:36:12.933 回答
0

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;

于 2020-07-30T08:28:26.343 回答