2014-08-27 3 views
0

Учитывая это:псевдоним столбца Кастинг в ORDER BY пункте

CREATE TABLE test (
    a int, 
    b varchar(255) 
); 

INSERT INTO test VALUES(1, '100'); 
INSERT INTO test VALUES(1, '50'); 
INSERT INTO test VALUES(1, '075'); 
INSERT INTO test VALUES(1, '+50'); 
INSERT INTO test VALUES(1, '-50'); 

SELECT a, b AS c 
FROM test AS t 
ORDER BY t.a, c; 

SELECT a, b AS c 
FROM test AS t 
ORDER BY t.a, t.b::int; 

SELECT a, b AS c 
FROM test AS t 
ORDER BY t.a, c::int; 

Последний запрос возвращает ошибку:
ERROR: column "c" does not exist: SELECT a, b AS c FROM test AS t ORDER BY t.a, c::int

Я хочу заказать результат, полученный псевдоним столбца.
Если я дополнительно хочу указать конкретный столбец, заданный псевдонимом, он не работает.

В чем причина ORDER BY alias работает и ORDER BY alias::int нет?
Есть ли другой способ использования псевдонимов столбцов в лите?

+0

Ваш [SQL Fiddle] (http://sqlfiddle.com/#!15/fbc54/1) пуст! –

+0

Я поставил SQL в вопрос ... – m13r

ответ

1

Это большое длинное для комментарий.

Here ранняя ссылка на этот вопрос, от которого я цитирую:

ORDER BY (and also GROUP BY) permit references to output column names only when they are unadorned. You cannot use them in expressions.

Если бы я должен был рассуждать о причинах этого, он будет иметь дело с оценкой выражения. Я думаю, что двигатель Postgres логически переписывает запрос, чтобы быть что-то вроде:

SELECT a, b AS c, c::int as INVISIBLEUNSEENCOLUMN 
FROM test AS t 
ORDER BY t.a, INVISIBLEUNSEENCOLUMN; 

То есть, она перемещает выражение, где выражения обычно оцениваются (в то, что я мог бы назвать «выбрать» узел в скомпилированный код). Ну, это генерирует известную ошибку столбца, потому что этот код не понимает псевдонимы, определенные на одном уровне. Когда я хочу использовать псевдонимы столбцов в запросе, я часто использую подзапросы, чтобы избежать путаницы.

Для решения этой проблемы достаточно просто: использовать подзапрос, использовать исходное имя столбца в order by или включить значение отливки в select.

0

Это связано с последовательностью событий в SQL и предложением Select; где предусмотрены псевдонимы столбцов, является вторым последнем

1: FROM 
2: the JOINS 
3: WHERE clause 
4: GROUP BY clause 
5: HAVING clause 
6: SELECT clause 
7: ORDER BY clause 

ORDER BY является последней, так на этом этапе было выполнено ВЫБОР положения и псевдонимы столбцов будут доступны по заказу.

Однако все предложения до выполнения предложения select не понимают псевдонимы столбцов.


самый многопоточный способ обхода, «гнездо» запроса, например.

select col_alias from (select x as col_alias from y) 

EDIT: единственное исключение к этому, что я знаю в продукте Teradata (может быть и другими, но я использовал много)

Смежные вопросы