Виртуальный столбец PostgreSQL - столбец не существует? - PullRequest
7 голосов
/ 07 июля 2011

Используя 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

К сожалению, я получаю следующую ошибку:

PGError: ERROR:  column "virtual_field" does not exist
LINE 1: ...ies" ("entities".thing_id = 9999 AND (virtual_fiel...
                                                 ^

Сообщение об ошибке довольноочевидно, но я буду проклят, если смогу понять правильный синтаксис того, что я пытаюсь сделать.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'
)

Мой мозг подвел меня - может кто-нибудь помочь мне разобраться?

Ответы [ 2 ]

9 голосов
/ 07 июля 2011

Если вы поместите «основной» оператор в производную таблицу, вы можете использовать псевдоним:

    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

Кстати: вам не нужно выражение i boolean_field = 't' (если это действительно столбец типа boolean). AND boolean_field достаточно, поскольку это допустимое логическое выражение.

6 голосов
/ 07 июля 2011

Нельзя использовать псевдоним (например, virtual_prices здесь) из предложения SELECT в предложении WHERE, как это.

Вы можете использовать их в ORDER BY, но не в WHERE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...