SQL错误-列不存在(在SELECT中为)

T10*_*000 2 sql postgresql activerecord

我要加入两个表: 品种 + 品种特性(bc)

但我收到以下错误:

PG :: UndefinedColumn:错误:列“ val”不存在第11行

我不确定出什么问题,这是我的SQL:

SELECT                                                                      
  breeds.*,                                                                 
  CASE bc.user_val                                                          
    WHEN NULL THEN bc.value                                                   
     ELSE (bc.value + (bc.user_val/2))/2                                       
   END AS val                                                                
  FROM                                                                        
  breed_characteristics bc       
  INNER JOIN breeds ON breeds.id = bc.breed_id                                
  WHERE bc.characteristic_id = 45                               
  AND val BETWEEN 4 AND 5                              
  ORDER BY val DESC
Run Code Online (Sandbox Code Playgroud)

(通过Active Record在Postgres上执行此查询)

Gur*_*ngh 6

您不能val在这样的where子句中使用表达式别名。

这是因为在SQL标准中指定了执行SQL的顺序。在这里,该WHERE子句是在之前评估的SELECT,因此,该WHERE子句不知道您在中创建的别名SELECT。在ORDER BY谈到后SELECT,因此可以使用别名。

只需将别名替换为实际的case表达式,如下所示:

SELECT                                                                      
  breeds.*,                                                                 
  CASE bc.user_val                                                          
    WHEN NULL THEN bc.value                                                   
     ELSE (bc.value + (bc.user_val/2))/2                                       
   END AS val                                                                
  FROM                                                                        
  breed_characteristics bc       
  INNER JOIN breeds ON breeds.id = bc.breed_id                                
  WHERE bc.characteristic_id = 45                               
  AND CASE WHEN bc.user_val is NULL THEN bc.value                                                   
     ELSE (bc.value + (bc.user_val/2))/2                                       
   END BETWEEN 4 AND 5                              
  ORDER BY val DESC
Run Code Online (Sandbox Code Playgroud)

但是,可以在order by子句中使用别名。