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


