2017-01-17 26 views
5

W instrukcji SELECT chcę ponownie użyć kolumny obliczeniowej w klauzuli WHERE. Czy jest jakiś sposób to zrobić w SQLserver?Ponownie użyj kolumny obliczeniowej w klauzuli WHERE

uproszczony przykład:

robocza, ale z wielokrotnym obliczenia:

SELECT field1, concat(field2, field3) AS calc_field 
    FROM MyTable 
    WHERE concat(field2, field3) LIKE 'A%' 

życzenia:

SELECT field1, concat(field2, field3) AS calc_field 
    FROM MyTable 
    WHERE calc_field LIKE 'A%' 
+0

Czy obawiasz się, że na twoim pierwszym przykładzie obliczenia są wykonywane dwukrotnie? – AakashM

+0

@AakashM obawiam się nie tylko, że obliczenia są wykonywane dwa razy (nie jestem tego pewien, czy jest to wewnętrznie zoptymalizowany?) ... ale również wielokrotnie przepisuję ten sam kod w bardziej złożonych instrukcjach. – MarcM

+0

W zależności od tego, jak często chcesz to filtrować, możesz umieścić kolumnę obliczeniową na stole. – cloudsafe

Odpowiedz

6

Nie ma możliwości ponownego użycia obliczonego pola na tym samym poziomie: SELECT. Będziesz musiał zagnieździć go, aby użyć aliasu.

SELECT field1 
    , calc_field 
FROM (
    SELECT field1 
     , CONCAT (field2, field3) AS calc_field 
    FROM MyTable 
    ) tbl 
WHERE calc_field LIKE 'A%' 

This is because of the order in which clauses are executed in a SQL query. Jak widać na liście klauzule są wymienione, klauzula SELECT, gdzie jest generowany alias, jest wykonywana po klauzuli WHERE.

W ten sposób alias nie jest "widoczny" w klauzuli WHERE, ponieważ alias jest generowany po zastosowaniu WHERE.

3

zawiń go w tabeli pochodzącej:

select field1, calc_field 
from 
(
    SELECT field1, concat(field2, field3) AS calc_field 
    FROM MyTable 
) dt 
WHERE calc_field LIKE 'A%' 
0

Dla SQL Server można użyć + jako identyfikator konkatenacji

SELECT field1, field2 +field3 AS calc_field 
 
    FROM MyTable 
 
    WHERE field2 + field3 LIKE 'A%'

Dla lepszej wydajności unikać przy użyciu pól połączone w klauzuli WHERE. W zależności od wymagań WHERE (pole2 jak „A%” lub field3 jak „A%”) może być lepszym rozwiązaniem

1

Korzystanie sub Query do osiągnięcia tego celu:

select field1, calc_field from 
(SELECT field1, concat(field2, field3) AS calc_field FROM MyTable 
) as dt 
WHERE calc_field LIKE 'A%' 
2

Inną odmianą istniejących odpowiedzi jest aby użyć wspólnego wyrażenia tabelowego (CTE):

WITH cte AS (
    SELECT field1, concat(field2, field3) AS calc_field 
    FROM mytable 
) 
SELECT field1, calc_field 
FROM cte 
WHERE calc_field LIKE 'A%'