Stosowanie IN do znalezienia jednej wartości w wielu kolumnach

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

Dodaj komentarz