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

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

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

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

但这是有效的

  1. select marks,
  2. CASE
  3. WHEN marks<65 then 'F'
  4. WHEN marks>65 then 'P'
  5. END grade
  6. from marks
sy5wg1nm

sy5wg1nm1#

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

  1. END m.grade

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

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

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

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

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

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

展开查看全部
cedebl8k

cedebl8k2#

不能将列值用作列别名

  1. Select 1 AS Alias_1,
  2. CASE
  3. WHEN 1=1 THEN 1
  4. WHEN 2=2 THEN 2
  5. END AS Alias_2_AnyName
  6. from dual d;

如果你使用

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

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

展开查看全部
2jcobegt

2jcobegt3#

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

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

相关问题