PostgreSQL虚拟列列不存在?

Dan*_*ail 7 postgresql ruby-on-rails

使用PostgreSQL 8.4,我试图将以下查询放在一起:

SELECT (field_a + field_b + field_c) AS virtual_field, *
FROM "entities" 
WHERE ("entities".thing_id = 9999 AND (virtual_field > 0)) 
AND (boolean_field = 't') 
ORDER BY virtual_field DESC
Run Code Online (Sandbox Code Playgroud)

不幸的是,我一直收到以下错误:

PGError: ERROR:  column "virtual_field" does not exist
LINE 1: ...ies" ("entities".thing_id = 9999 AND (virtual_fiel...
                                                 ^
Run Code Online (Sandbox Code Playgroud)

错误信息非常明显,但如果我能找出正在尝试做的正确语法,我会被诅咒.field_a,field_b并且field_c都是我entities表中的真正列.

作为参考,我使用Rails(2.3.11)来编写查询.这是我正在使用的(匿名)代码:

Thing.entities.boolean_scope.find(:all, 
  :select     => "(field_a + field_b + field_c) AS virtual_field, *",
  :conditions => ['virtual_field > ?', value],
  :order      => 'virtual_field DESC'
)
Run Code Online (Sandbox Code Playgroud)

我的大脑失败了 - 任何人都可以帮助我解决这个问题吗?

a_h*_*ame 9

如果将"main"语句放入派生表中,则可以使用别名:

    SELECT *
    FROM 
    (
        SELECT (field_a + field_b + field_c) AS virtual_field,
               entities.*
        FROM entities 
    ) t
    WHERE thing_id = 9999 
      AND virtual_field > 0
      AND boolean_field = 't'
    ORDER BY virtual_field DESC
Run Code Online (Sandbox Code Playgroud)

顺便说一句:你不需要表达式boolean_field = 't'(如果它真的是一个类型的列boolean).AND boolean_field这是足够的,因为这是一个有效的布尔表达式.


Tom*_*omH 6

您不能像virtual_pricesWHERE子句中的SELECT子句那样使用别名(如此处).

您可以在ORDER BY中使用它们,但不能在WHERE中使用它们.