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.
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:
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