Z dokumentacji technet: https://docs.microsoft.com/en-us/sql/t-sql/language-elements/in-transact-sql
IN (Transact-SQL) – Determines whether a specified value matches any value in a subquery or a list. |
Oficjalna dokumentacja nie wspomina o możliwości wykorzystania polecenia IN do przeszukiwania wielu kolumn dla podanej wartości. Jednak implementacja przewiduje takie przypadki, pokaże też na co engine zamienia takie polecenie.
Czasami zdecydowanie szybciej i wygodniej jest użyć tej konstrukcji zamiast kombinować z warunkami na OR. Sami zobaczcie:
Przykład:
Tworzymy tabelę, jedna kolumna z kluczem i cztery gdzie będziemy ładowali dane. Do niektórych kolumn insertujemy słowo ‚ugabuga’, którego później będziemy szukac.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
DECLARE @t TABLE ( id INT IDENTITY PRIMARY KEY , col1 VARCHAR(10) , col2 VARCHAR(10) , col3 VARCHAR(10) , col4 VARCHAR(10) ) INSERT INTO @t SELECT '1' , '2' , '3' , '4' UNION ALL SELECT '1' , 'ugabuga' , '3' , '4' UNION ALL SELECT '2' , '3' , 'ugabuga' , '5' UNION ALL SELECT '3' , '4' , '5' , 'ugabuga' SELECT * FROM @t |
Wynikiem będzie tabela:
I teraz jak się nie namęczyć żeby nie pisać czterech warunków: WHERE col1 = ‚ugabuga’ OR col2 = ‚ugabuga’ OR (…)
wystarczy „odwrócić” IN:
1 2 3 |
SELECT * FROM @t WHERE 'ugabuga' IN ( col1, col2, col3, col4 ) |
Wynik:
Jak SQL Interpretuje takie zapytanie?
Możemy sprawdzić to na execution planie. Widać, że sam zamienia to na ORy 🙂
POST PIERWOTNIE OPUBLIKOWANY JAKO TSQL NA DZIŚ #28