Postgres CASE声明

时间:2014-04-01 16:17:15

标签: database postgresql

我似乎无法让CASE部分工作

SELECT ROUND((SUM((to_number(g.grade, '9D99') * s.subjunits)))/(SUM(s.subjunits)), 2),    CASE WHEN g.grade='DRP' THEN '5.00' END
           FROM (grade g
             INNER JOIN registration r ON r.grade_id = g.grade_id)
             INNER JOIN subject s ON s.subjcode = r.subjcode
           WHERE g.grade NOT IN ('INC', 'W', 'INP') 
             AND r.sy = right(to_char(extract(year from now()- interval '1 year'),'9999'), 4)||'-'||right(to_char(extract(year from now()), '9999'),4)
             AND r.sem IN ('1', '2')
             AND r.studid='2012-0004'
           GROUP BY g.grade;

我真正想做的就是,如果学生有DRP等级,它将自动计为5.0,以便数据库可以包括DRP来计算GPA。

但它只是说

ERROR:  invalid input syntax for type numeric: " "
********** Error **********

ERROR: invalid input syntax for type numeric: " "
SQL state: 22P02

目前正在使用postgresql 9.3.2

2 个答案:

答案 0 :(得分:0)

CASE部分没问题(虽然你错过了ELSE,它应该仍然有效,并且可选择返回NULL)。

错误是由TO_NUMBER()函数引起的。

答案 1 :(得分:0)

case语句返回一个值,该值与您输入的任何值本身没有任何关系。您似乎认为您的case语句将更新g.grade的值。它没有赢。我想你想要做的是在第一个函数中使用case语句代替g.grade的值。也许:

SELECT ROUND((SUM((to_number((case when g.grade='DRP' then '5.00' else g.grade end), '9D99') * s.subjunits)))/(SUM(s.subjunits)), 2)

我没有Postgres的副本,所以我无法对此进行测试,而且我不熟悉to_number功能(自从我使用Postgres以来已经过去了好几年) 。但这不是你问题的重点,所以如果这不是正确的方式来拨打号码,那就是另一个问题。