2015-07-01 13 views
5

Ho la seguente tabella:Postgres collazione sul campo alias

CREATE TABLE public_bodies 
    ("id" int, "name" varchar(46)) 
; 

INSERT INTO public_bodies 
    ("id", "name") 
VALUES 
    (1, 'Ytre Helgeland District Psychiatric Centre'), 
    (2, 'Åfjord Municipality'), 
    (3, 'Østfold Hospital') 
; 

mi piacerebbe eseguire questa query:

SELECT public_bodies.id, public_bodies.name AS display_name 
FROM public_bodies 
ORDER BY display_name COLLATE "en_US"; 

Ma ottengo questo errore:

ERROR: column "display_name" does not exist 
LINE 3: ORDER BY display_name COLLATE "en_US"; 
       ^

L'ordinamento in base al nome della tabella funziona correttamente:

SELECT public_bodies.id, public_bodies.name AS display_name 
FROM public_bodies 
ORDER BY public_bodies.name COLLATE "en_US"; 

-- id |  display_name 
-- ----+-------------------------------------------- 
-- 2 | Åfjord Municipality 
-- 3 | Østfold Hospital 
-- 1 | Ytre Helgeland District Psychiatric Centre 

Ordinamento sul alias funziona troppo bene:

SELECT public_bodies.id, public_bodies.name AS display_name 
FROM public_bodies 
ORDER BY display_name; 

-- id |  display_name 
-- ----+-------------------------------------------- 
-- 2 | Åfjord Municipality 
-- 3 | Østfold Hospital 
-- 1 | Ytre Helgeland District Psychiatric Centre 

Applicando la COLLATE prima di assegnare le opere alias, ma non capisco il motivo per cui questo è diverso per la fascicolazione dopo la ORDER_BY. Versione

SELECT public_bodies.id, public_bodies.name COLLATE "en_US" AS display_name 
FROM public_bodies 
ORDER BY display_name; 

-- id |  display_name 
-- ----+-------------------------------------------- 
-- 2 | Åfjord Municipality 
-- 3 | Østfold Hospital 
-- 1 | Ytre Helgeland District Psychiatric Centre 

Postgres:

SELECT version(); 
               version 
------------------------------------------------------------------------------------------------------------- 
PostgreSQL 9.1.12 on x86_64-unknown-linux-gnu, compiled by gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3, 64-bit 

ho ottenere gli stessi risultati su SQL violino (Postgres 9.3).

Perché Postgres non può fascicolare sul campo con l'alias?

+1

In Postgresql probabilmente non è possibile utilizzare un alias nella clausola dell'ordine in qualsiasi momento –

+1

Appena aggiornata la domanda - l'ordinamento dell'alias senza collazione va bene. – ghr

+0

Odora di insetto. L'hai provato nella versione attuale, 9.4.4? –

risposta

0

È il modo in cui viene definita la lingua. Le clausole COLLATE si applicano alle espressioni e questo caso non è valido.

Per "espressione", intendo un insieme di operatori, funzioni, identificatori di variabili, valori letterali, ecc., Combinati per produrre un valore di uscita. In altre parole, la classe generale di "cose" produttrici di valore che possono apparire come argomento di funzione, come una definizione di campo SELECT, in un elenco VALUES e così via.

Una clausola COLLATE può essere attaccato ad un'espressione, e l'espressione può essere visualizzato in un elenco ORDER BY, ma non è la cosa solo consentito in un elenco ORDER BY; puoi anche includere lo names or positions of output columns, ma questi sono trattati come un caso distinto dal parser.

Il motivo per cui devono essere trattati in modo diverso è che gli identificativi del campo di output della query non sono in scope durante la valutazione delle espressioni; questo è il motivo per cui qualcosa come ORDER BY display_name || 'x' torna con column "display_name" does not exist. Per ovviare al problema, i nomi dei campi nudi nell'elenco ORDER BY vengono confrontati con l'elenco di output prima ancora che venga tentata la valutazione dell'espressione, ma di conseguenza, in questo contesto non è accettato nulla di più complesso di un nome di campo nudo (che include un allegato COLLATE clausola).

Problemi correlati