2012-03-26 16 views
7

lo que permite decir que tengo una consulta como estaUtilice el número de columna de la cláusula select en where cláusula. allias de extracción nombre original

SELECT a as d,b,c FROM myTable 
    WHERE a=1; 

¿Es posible en lugar de a = 1 para escribir algo así como SELECTED.1 = 1 o extraer alguna manera allias nombre original dado que d = 1 no funciona

+3

¿Por qué querrías hacer esto? –

+1

@JohnSaunders, porque tal vez el elemento alias es una expresión compleja que no desea tener que repetir en la cláusula where. –

Respuesta

10

No es posible hacerlo debido a las complejidades internas sobre cuándo se evalúa la cláusula WHERE. Pero si la cosa a la que alias es una expresión larga que preferiría no repetir, existe una solución típica para esto. De https://forums.oracle.com/forums/thread.jspa?threadID=1107532:

La solución estándar a esto es, se mueve la consulta en una vista en línea (sin el predicado cláusula-where), y luego añadir el predicado donde cláusula, usando el alias, en el consulta externa.

Así que algo como esto:

select ... 
from (select ... here complex expression that is aliased ... 
     from ... 
     where) A 
where ... here condition that uses the A.alias column ... 

En su caso ejemplo, que sería:

SELECT d, b, c 
FROM (SELECT a AS d, b, c FROM myTable) AS myAliasedTable 
WHERE d = 1 

Pero, por supuesto, esto no tendría sentido literal en su ejemplo. Si lo que está aliasing es solo un nombre de columna, entonces simplemente use el nombre de la columna real en el DONDE, sin ningún inconveniente real en ese caso.

También tenga en cuenta que si utiliza este método, debe poner tanto de la cláusula WHERE como pueda en la consulta interna (es decir, las partes que no hacen referencia a una columna con alias) para limitar el tamaño del resultado tabla aliased Por ejemplo, si también quería probar en b en su ejemplo, que sería:

SELECT d, b, c 
FROM (
    SELECT a AS d, b, c 
    FROM myTable 
    WHERE b = 1 
) AS myAliasedTable 
WHERE d = 1