2009-04-03 15 views

Odpowiedz

14

niemożliwe, ale można wykonać następujące czynności:

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

Brak wymaganych podkwerend lub hacków

+12

Ale co, jeśli funkcja tworząca col1 jest wymagająca. Następnie uruchamiasz go dwa razy? (Podciągu 4 razy w tym przypadku) – DavidVdd

+4

I, powielacie kod. Instrukcja klauzuli select jest taka sama, jak klauzula where, która podwaja wysiłek utrzymania. –

1

myślę, że nie jest możliwe, ale może można spojrzeć na wspólnym stole zgłaszanie nad SQL 2005

tak:

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' 

(wiem, że to działa w Oracle, uważam, że jest standardem SQL i będzie działać w MSSQL.)

+0

Prawdopodobnie będzie wolniej, jeśli wewnętrzne zapytanie stanie się złożone. –

14

Użyj podkwerenda:

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

użyj widoku lub tabeli pochodnej.

Korzystanie tabelę pochodzącą Twój Przykładem może wyglądać następująco:

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

Odpowiedź brzmi nie można - można to zrobić

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

Faktycznie, używając pseudonimu nie będzie twój zapytanie szybsze, ponieważ optymalizator SQL nie jest tak głupi, jak ci się wydaje, więc po prostu powtórzę wyrażenie SUBSTRING.

+2

Dla mnie szuka sposobu na łatwiejsze odczytanie zapytania. –

+1

To trochę naruszenie zasady DRY, prawda? Gdy modyfikujesz klauzulę select, musisz również zmodyfikować WHERE ... –

+0

Dodanie podzapytania lub użycie opcji Ma sprawi, że zapytanie będzie bardziej złożone, co jest gorsze niż dwukrotne powtórzenie takiego prostego wyrażenia. – zvolkov

6

Można to zrobić:

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

Można użyć "mieć", a nie "gdzie".

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

Po wykonaniu czynności "gdzie" po wykonaniu zapytania. Należy uważać, aby używać go w odpowiednich warunkach, aby nie występował problem z wydajnością.

+4

Jest to najłatwiejsze do wdrożenia i najbardziej uniwersalne rozwiązanie. Nie wiem, dlaczego nie jest bardziej głosowany. – Greg

+5

Elegancki, ale nie działa:/(MSSQL 2008 R2) – Akli

+1

TO JEST PRAWIDŁOWA ODPOWIEDŹ. – aaa90210