2012-03-12 25 views
6

Problema

estoy usando nombre de la columna alterna (alias) en una consulta, puedo usar el alias "given_name" como parte de la orden por, pero no soy capaz de utilizarlo como parte de la cláusula WHERE. WHERE "given_name" se transfiere como resultado de una solicitud fuera de mi control y no sé el nombre de columna real que se debe usar en la condición WHERE.Alias ​​de columna en una cláusula WHERE

Pregunta

  1. Es allí una manera/piratear utilizar un alias de columna en una cláusula WHERE?
  2. ¿Hay alguna manera de encontrar el nombre de columna de un alias?

Investigación

Después de algunas investigaciones se ve como alias se añaden después de después de la cláusula WHERE.

Ejemplo

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 

Respuesta

4

no probado, pero este truco debería funcionar ...

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 

funciona simplemente creando una tabla temporal desde su declaración de selección original (sin la cláusula where y ordenando), que tiene la columna na mes que especificas A continuación, seleccione de aquí con los nombres de columna que desee.

Un mejor enfoque podría ser la creación de una vista, con los nombres de las columnas que desea, y seleccione en 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; 

Y entonces ...

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

Gracias, gran explicación. Ambas soluciones funcionan, sin embargo, después de la evaluación comparativa frente a una gran tabla, la solución de visualización proporciona un rendimiento mucho mejor. –

+0

Sospecho que podría ser así, ya que solo tendrá que hacer una declaración de selección completa una vez para la vista, luego puede almacenarla en caché e indexarla para futuras llamadas (no estoy seguro de cómo funcionan los detalles de esto). Espero que el rendimiento sea ligeramente mejor simplemente refiriéndome a los nombres de las columnas originales, y no a la vista en conjunto, pero espero que no sea una gran diferencia. –

1

En caso de duda, simplemente se refieren a la columna por número:

... 
ORDER BY 2 
... 
+0

¿No sería mejor usar el nombre completo 'given.name'? el orden de las columnas no es realmente un enfoque robusto –

+0

Esto funciona sin embargo el "given_name" fue pasado como resultado de la solicitud del cliente fuera de mi control. No tengo forma de determinar el número de la columna o que "given_name" es un alias para given.name. –

3

Puede solo use alias de columna en cláusulas GROUP BY, ORDER BY o HAVING.

SQL estándar no le permite hacer referencia a un alias de columna en una cláusula WHERE. Esta restricción se impone porque cuando se ejecuta el código WHERE, aún no se puede determinar el valor de la columna.

Cuestiones relacionadas