2009-04-03 29 views
19

Me gustaría saber cómo podría usar un alias en una sentencia where.SQL Usar alias en la instrucción Where

Ejemplo:

SELECT SUBSTRING(Column1, 1, 4) + SUBSTRING(Column1, 4, 3) AS Col1 
FROM MyTable 
WHERE Col1 = 'MySearch' 

utilizo MSSQL 2005

Respuesta

14

No es posible, pero se puede hacer lo siguiente:

SELECT SUBSTRING(Column1, 1, 4) + SUBSTRING(Column1, 4, 3) AS Col1 
FROM MyTable 
WHERE SUBSTRING(Column1, 1, 4) + SUBSTRING(Column1, 4, 3) = 'MySearch' 

No hay subconsultas o hacks requieren

+12

Pero, ¿y si la función que crea col1 es exigente? Entonces, ¿lo ejecuta dos veces? (Subcadena 4 veces en este caso) – DavidVdd

+4

Y, está duplicando el código. La declaración en la cláusula de selección es la misma que en la cláusula where, que dobla el esfuerzo por mantener. –

1

Creo que no es posible, pero tal vez usted puede echar un vistazo en expresiones de tabla comunes sobre SQL 2005

De esta manera:

WITH MyCTE(Col1) AS 
(
SELECT SUBSTRING(Column1, 1, 4) + SUBSTRING(Column1, 4, 3) AS Col1 
FROM MyTable 
) 
SELECT * 
FROM MyCTE 
WHERE Col1 = 'MySearch' 
5
SELECT * FROM (
    SELECT SUBSTRING(Column1, 1, 4) + SUBSTRING(Column1, 4, 3) AS Col1 
    FROM MyTable 
) 
WHERE Col1 = 'MySearch' 

(Sé que esto funciona en Oracle, creo que es SQL estándar y funcionaría en MSSQL.)

+0

Es probable que sea más lento sin embargo, si la consulta interna se vuelve compleja. –

14

Utilice una subconsulta:

SELECT * 
FROM 
    (SUBSTRING(Column1, 1, 4) + SUBSTRING(Column1, 4, 3) AS Col1 FROM MyTable) 
WHERE Col1 = 'MySearch' 
1

utilizar una vista o una tabla derivada.

Usando una tabla derivada, a su ejemplo se vería así:

select col1 
from 
(SELECT SUBSTRING(Column1, 1, 4) + SUBSTRING(Column1, 4, 3) AS Col1 
FROM MyTable) 
where col1='Mysearch' 
0

La respuesta es que no puede - usted puede hacer esto

SELECT 
    SUBSTRING(Column1, 1, 4) + SUBSTRING(Column1, 4, 3) AS Col1 
FROM 
    MyTable 
WHERE 
    SUBSTRING(Column1, 1, 4) + SUBSTRING(Column1, 4, 3) = 'MySearch' 
1

En realidad, el uso de alias no hará que su consulta más rápido ya que el optimizador de SQL no es tan tonto como crees, así que simplemente repetiría la expresión SUBSTRING nuevamente.

+2

Para mí, él está buscando una forma de hacer la consulta más legible –

+1

Eso es un poco una violación del principio SECO, ¿no? Cuando modifica la cláusula de selección, debe asegurarse de modificar también el WHERE ... –

+0

Agregar una subconsulta o usar Having hará que la consulta sea más compleja, lo que es peor que repetir una expresión tan simple dos veces. – zvolkov

6

Usted puede hacer esto:

SELECT Col1 
FROM (SELECT SUBSTRING(Column1, 1, 4) + SUBSTRING(Column1, 4, 3) AS Col1) AS x 
WHERE Col1 = 'MySearch' 
39

Puede utilizar "tener" en lugar de "donde".

SELECT 
    SUBSTRING(Column1, 1, 4) + SUBSTRING(Column1, 4, 3) AS Col1 
FROM 
    MyTable 
HAVING 
    Col1 = 'MySearch' 

Tener un "dónde" después de la ejecución de la consulta. Tenga cuidado de usarlo en las condiciones adecuadas para no tener ningún problema de rendimiento.

+4

Esta es la solución más fácil de implementar y la más versátil. No sé por qué no se votó más. – Greg

+5

Elegante pero no funciona:/(MSSQL 2008 R2) – Akli

+1

ESTA ES LA RESPUESTA CORRECTA. – aaa90210

Cuestiones relacionadas