복붙노트

[SQL] IN 연산자를 사용하는 변수를 정의 (T-SQL)

SQL

IN 연산자를 사용하는 변수를 정의 (T-SQL)

나는 IN 연산자를 사용하여 Transact-SQL 쿼리를 가지고있다. 이 같은:

select * from myTable where myColumn in (1,2,3,4)

"(1,2,3,4)"전체 목록을 보유하는 변수를 정의 할 수있는 방법이 있습니까? 어떻게 그것을 정의 하는가?

declare @myList {data type}
set @myList = (1,2,3,4)
select * from myTable where myColumn in @myList

해결법

  1. ==============================

    1.

    DECLARE @MyList TABLE (Value INT)
    INSERT INTO @MyList VALUES (1)
    INSERT INTO @MyList VALUES (2)
    INSERT INTO @MyList VALUES (3)
    INSERT INTO @MyList VALUES (4)
    
    SELECT *
    FROM MyTable
    WHERE MyColumn IN (SELECT Value FROM @MyList)
    
  2. ==============================

    2.

    DECLARE @mylist TABLE (Id int)
    INSERT INTO @mylist
    SELECT id FROM (VALUES (1),(2),(3),(4),(5)) AS tbl(id)
    
    SELECT * FROM Mytable WHERE theColumn IN (select id from @mylist)
    
  3. ==============================

    3.SQL 쿼리 동적 csv 파일 목록을 해결하는 방법은 두 가지가 있습니다 :

    SQL 쿼리 동적 csv 파일 목록을 해결하는 방법은 두 가지가 있습니다 :

    1) 내부 선택 사용

    SELECT * FROM myTable WHERE myColumn in (SELECT id FROM myIdTable WHERE id > 10)
    

    2) 동적 CONCATENATE SQL을 사용하여

    DECLARE @sql varchar(max)  
    declare @list varchar(256)  
    select @list = '1,2,3'  
    SELECT @sql = 'SELECT * FROM myTable WHERE myColumn in (' + @list + ')'
    
    exec sp_executeSQL @sql
    

    3) 셋째 가능한 옵션 테이블 변수이다. 당신은 SQL 서버 2005이있는 경우는 테이블 변수를 사용할 수 있습니다. 귀하는 SQL Server 2008에서 당신은 저장 프로 시저에 대한 매개 변수로에서 전체 테이블 변수를 전달할 수 있으며 조인 또는 IN 절에서 부속으로 사용하는 경우.

    DECLARE @list TABLE (Id INT)
    
    INSERT INTO @list(Id)
    SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4
    
    
    SELECT
        * 
    FROM 
        myTable
        JOIN @list l ON myTable.myColumn = l.Id
    
    SELECT
        * 
    FROM 
        myTable
    WHERE
        myColumn IN (SELECT Id FROM @list)
    
  4. ==============================

    4.이 같은 기능을 사용 :

    이 같은 기능을 사용 :

    CREATE function [dbo].[list_to_table] (@list varchar(4000))
    returns @tab table (item varchar(100))
    begin
    
    if CHARINDEX(',',@list) = 0 or CHARINDEX(',',@list) is null
    begin
        insert into @tab (item) values (@list);
        return;
    end
    
    
    declare @c_pos int;
    declare @n_pos int;
    declare @l_pos int;
    
    set @c_pos = 0;
    set @n_pos = CHARINDEX(',',@list,@c_pos);
    
    while @n_pos > 0
    begin
        insert into @tab (item) values (SUBSTRING(@list,@c_pos+1,@n_pos - @c_pos-1));
        set @c_pos = @n_pos;
        set @l_pos = @n_pos;
        set @n_pos = CHARINDEX(',',@list,@c_pos+1);
    end;
    
    insert into @tab (item) values (SUBSTRING(@list,@l_pos+1,4000));
    
    return;
    end;
    

    대신에 같이 사용하여, 당신은 내부 함수에 의해 반환 된 테이블과 조인합니다

    select * from table_1 where id in ('a','b','c')
    

    가된다

    select * from table_1 a inner join [dbo].[list_to_table] ('a,b,c') b on (a.id = b.item)
    

    색인화되지 않은 1M 레코드 테이블에서 두 번째 버전은 시간 반 걸렸다 ...

    건배

  5. ==============================

    5.

    DECLARE @myList TABLE (Id BIGINT) INSERT INTO @myList(Id) VALUES (1),(2),(3),(4);
    select * from myTable where myColumn in(select Id from @myList)
    

    참고 긴 목록 또는 생산 시스템에 그것 (1,2,3,4)에서 someColumnName 같은 간단한 INoperator보다 훨씬 더 느릴 수 있으므로이 방법을 사용하지 않는 것이 좋습니다 것을 (8000+ 항목 목록을 사용하여 테스트)하시기 바랍니다

  6. ==============================

    6.아니, 그런 타입은 없습니다. 그러나 몇 가지 선택이있다 :

    아니, 그런 타입은 없습니다. 그러나 몇 가지 선택이있다 :

    이 중 어느 것도 정말 우아한 없다,하지만이 최고입니다.

  7. ==============================

    7.SQL2017 시작하면 STRING_SPLIT를 사용하여이 작업을 수행 할 수 있습니다

    SQL2017 시작하면 STRING_SPLIT를 사용하여이 작업을 수행 할 수 있습니다

    declare @myList nvarchar(MAX)
    set @myList = '1,2,3,4'
    select * from myTable where myColumn in (select value from STRING_SPLIT(@myList,','))
    
  8. ==============================

    8.@LukeH에 약간의 개선은 "INSERT INTO"를 반복 할 필요가 없다 : 및 realPT의 대답 @ - 선택 (SELECT)을 할 필요가 없습니다 :

    @LukeH에 약간의 개선은 "INSERT INTO"를 반복 할 필요가 없다 : 및 realPT의 대답 @ - 선택 (SELECT)을 할 필요가 없습니다 :

    DECLARE @MyList TABLE (Value INT) 
    INSERT INTO @MyList VALUES (1),(2),(3),(4)
    
    SELECT * FROM MyTable
    WHERE MyColumn IN (SELECT Value FROM @MyList)
    
  9. ==============================

    9.두 번째 테이블을 사용하지 않고이 작업을 수행하려면, 당신은 CAST와 LIKE 비교를 수행 할 수 있습니다

    두 번째 테이블을 사용하지 않고이 작업을 수행하려면, 당신은 CAST와 LIKE 비교를 수행 할 수 있습니다

    DECLARE @myList varchar(15)
    SET @myList = ',1,2,3,4,'
    
    SELECT *
    FROM myTable
    WHERE @myList LIKE '%,' + CAST(myColumn AS varchar(15)) + ',%'
    

    당신이 비교하는 필드가 이미 문자열 인 경우에 당신은 CAST 필요가 없습니다.

    열 경기 쉼표 각각의 고유 한 값을 모두 주변은 정확하게 일치를 보장합니다. 그렇지 않으면 1의 값이 ', 4,2,15'를 포함하는 목록에서 발견된다

  10. ==============================

    10.나는 이것이 지금 오래 알고 있지만 => 2016 TSQL, 당신은 STRING_SPLIT을 사용할 수 있습니다 :

    나는 이것이 지금 오래 알고 있지만 => 2016 TSQL, 당신은 STRING_SPLIT을 사용할 수 있습니다 :

    DECLARE @InList varchar(255) = 'This;Is;My;List';
    
    WITH InList (Item) AS (
        SELECT value FROM STRING_SPLIT(@InList, ';')
    )
    
    SELECT * 
    FROM [Table]
    WHERE [Item] IN (SELECT Tag FROM InList)
    
  11. ==============================

    11.아무도 당신은 또한 배열을 JSON 사용하고 OPENJSON (Transact-SQL)를 참조하십시오 수 있습니다 서버 2016는 SQL에서 시작하기 전에 그것을 언급하지로 :

    아무도 당신은 또한 배열을 JSON 사용하고 OPENJSON (Transact-SQL)를 참조하십시오 수 있습니다 서버 2016는 SQL에서 시작하기 전에 그것을 언급하지로 :

    declare @filter nvarchar(max) = '[1,2]'
    
    select *
    from dbo.Test as t
    where
        exists (select * from openjson(@filter) as tt where tt.[value] = t.id)
    

    당신은 그것을에서 테스트 할 수 있습니다 SQL 바이올린 데모

    당신은 또한 쉽게 JSON 더 복잡한 경우를 커버 할 수 - SQL 변수를 WHERE IN 절을 사용하여 SQL의 값과 범위의 검색 목록을 보려면?

  12. ==============================

    12.

    DECLARE @StatusList varchar(MAX);
    SET @StatusList='1,2,3,4';
    DECLARE @Status SYS_INTEGERS;
    INSERT INTO  @Status 
    SELECT Value 
    FROM dbo.SYS_SPLITTOINTEGERS_FN(@StatusList, ',');
    SELECT Value From @Status;
    
  13. ==============================

    13.난 당신이 문자열을 선언하고 그 SQL 문자열을 실행해야합니다 생각합니다.

    난 당신이 문자열을 선언하고 그 SQL 문자열을 실행해야합니다 생각합니다.

    sp_executesql을에서보세요

  14. from https://stackoverflow.com/questions/1707326/define-variable-to-use-with-in-operator-t-sql by cc-by-sa and MIT license