2012-03-12 16 views
6

Problema

sto usando nome della colonna alternativo (alias) in una query, posso usare l'alias "given_name" come parte del ORDER BY, ma sono in grado di usarlo come parte di la clausola WHERE. Il WHERE "given_name" viene passato come risultato di una richiesta fuori dal mio controllo e non conosco il nome effettivo della colonna che dovrebbe essere usato nella condizione WHERE.colonna Alias ​​in una clausola WHERE

Domanda

  1. E c'è un modo/hack per utilizzare un alias di colonna in una clausola WHERE?
  2. C'è un modo per trovare il nome della colonna da un alias?

Research

Dopo alcune ricerche sembra alias sono aggiunti dopo dopo la clausola WHERE.

Esempio

SELECT profile.id AS id, given.name AS 'given_name', family.name AS 'family_name' 
FROM green_profile profile 
LEFT JOIN green_name given ON given.profileid = profile.id AND given.name_typeid = 0 
LEFT JOIN green_name family ON family.profileid = profile.id AND family.name_typeid = 1 
WHERE given_name LIKE 'levi%' 
ORDER BY given_name DESC LIMIT 0 , 25 

risposta

4

testato, ma questo hack dovrebbe funzionare ...

SELECT * FROM ( 
    SELECT profile.id AS id, given.name AS 'given_name', family.name AS 'family_name' 
    FROM green_profile profile 
    LEFT JOIN green_name given ON given.profileid = profile.id AND given.name_typeid = 0 
    LEFT JOIN green_name family ON family.profileid = profile.id AND family.name_typeid = 1 
) as temptable 
WHERE given_name LIKE 'levi%' 
ORDER BY given_name DESC LIMIT 0 , 25 

E funziona semplicemente creando una tabella temporanea dall'istruzione select originale (senza clausola where e order), che ha la colonna na mes che specifichi. Quindi selezionare da questo con i nomi delle colonne che si desidera.

Un approccio migliore potrebbe essere quella di creare una vista, con i nomi delle colonne che si desidera, e scegliere tra la vista ...

CREATE VIEW newtable AS 
SELECT profile.id AS id, given.name AS 'given_name', family.name AS 'family_name' 
FROM green_profile profile 
LEFT JOIN green_name given ON given.profileid = profile.id AND given.name_typeid = 0 
LEFT JOIN green_name family ON family.profileid = profile.id AND family.name_typeid = 1; 

E poi ...

SELECT * FROM newtable 
WHERE given_name LIKE 'levi%' 
ORDER BY given_name DESC LIMIT 0 , 25 
+0

Grazie, ottima spiegazione. Entrambe le soluzioni funzionano comunque dopo l'analisi comparativa con un grande tavolo, la soluzione di visualizzazione offre prestazioni molto migliori. –

+0

Ho il sospetto che potrebbe essere così, dato che sarà necessario eseguire l'intera istruzione di selezione solo una volta per la vista, quindi può memorizzarlo nella cache e indicizzarlo per le chiamate future (non sono sicuro di come funzionino i dettagli). Prevedo che le prestazioni saranno leggermente migliori semplicemente facendo riferimento ai nomi delle colonne originali e non occupandoci della vista complessiva, ma speriamo che non ci sia una grossa differenza. –

1

In caso di dubbio, è sufficiente fare riferimento alla colonna per numero:

... 
ORDER BY 2 
... 
+0

Non sarà meglio usare il nome completo 'given.name'? l'ordine delle colonne non è un approccio robusto –

+0

Questo funziona, tuttavia, il "given_name" è stato inoltrato come risultato della richiesta del client fuori dal mio controllo. Non ho modo di determinare il numero della colonna o che "given_name" è un alias per given.name. –

3

Puoi utilizzare solo alias di colonna nelle clausole GROUP BY, ORDER BY o HAVING.

SQL standard non consente di fare riferimento a un alias di colonna in una clausola WHERE. Questa restrizione è imposta perché quando viene eseguito il codice WHERE, il valore della colonna potrebbe non essere ancora determinato.