2009-09-02 18 views
8

¿Hay alguna solución para que pueda hacer algo como esto sin tener que repetir toda la expresión o forzar una UNIÓN o tabla temporal?¿Puedo volver a utilizar una expresión en una consulta MySQL como una variable para otro campo?

SELECT (complex expression) AS variable1, 
     (complex expression based on variable1) AS variable2 

Desde variable1 no está definido y disponible para el segundo artículo debido a la forma en que funciona mysql, el concepto anterior no puede funcionar.

O bien tengo que repetir la expresión para variable2, o usar UNIÓN o una tabla temporal y usar dos pasadas.

¿Hay algún truco que no conozco para lograr esto de manera más eficiente?

(tenga en cuenta que necesito saber la respuesta para ambos variable1 y variable2 ya que se utilizan a continuación para una inserción)

Gracias por cualquier idea!

+1

posible duplicado de [¿Puedo resuse un campo calculado en una consulta SELECT?] (http://stackoverflow.com/questions/6085443/can-i-resuse-a-calculated-field-in-a-select-query) –

Respuesta

6

empuje el primer cálculo a una tabla derivada:

select variable1 
    , complex_function(variable1, other_column) as variable2 
    , yet_another column 
    from (select complex_operation as variable1 
      , other_column 
      , yet_another_column 
      from whatever) dt 
+0

Es más complicado de lo que quería, pero voy a darte la mejor respuesta por tu esfuerzo, gracias. –

4
SELECT @v1:=(complex expression) AS variable1, 
     (complex expression * @v1) AS variable2 
+0

Voy a estar horrorizado si es así de fácil y honestamente no pude ¡Resuélvelo, pero gracias! –

+4

Ah, ¿sabes qué? La página de manual enumerada anteriormente por knittl tiene repetidas advertencias de no usar o depender de las variables establecidas en la misma instrucción SELECT ya que los campos pueden ejecutarse fuera de servicio en función de WHERE, etc. y la variable se retiene de la ejecución anterior. Así que reutilizar variables dentro del mismo SELECT es probablemente una mala idea, está destinado a consultas secuenciales. –

+0

personalmente nunca he visto el comportamiento advertido en el manual, incluso después de tratar de hacerlo realidad. pero si el manual lo advierte, entonces no lo usaría. * bleh * – longneck

0

Creo que la única manera es repetir su primera expresión_compleja en la segunda, aunque creo que mysql podría manejar tales casos.

edición: una búsqueda rápida apareció esto: http://dev.mysql.com/doc/refman/5.0/en/user-variables.html

+0

Gracias por el enlace, ¡de alguna manera me olvidé por completo de esa parte de MySQL! –

+0

Su enlace al manual fue muy útil para entender por qué la solución de cuello largo era defectuosa, gracias de nuevo. –

Cuestiones relacionadas