[SQL] IN 연산자를 사용하는 변수를 정의 (T-SQL)
SQLIN 연산자를 사용하는 변수를 정의 (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.
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.
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.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.이 같은 기능을 사용 :
이 같은 기능을 사용 :
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.
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.아니, 그런 타입은 없습니다. 그러나 몇 가지 선택이있다 :
아니, 그런 타입은 없습니다. 그러나 몇 가지 선택이있다 :
이 중 어느 것도 정말 우아한 없다,하지만이 최고입니다.
-
==============================
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.@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.두 번째 테이블을 사용하지 않고이 작업을 수행하려면, 당신은 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.나는 이것이 지금 오래 알고 있지만 => 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.아무도 당신은 또한 배열을 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.
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.난 당신이 문자열을 선언하고 그 SQL 문자열을 실행해야합니다 생각합니다.
난 당신이 문자열을 선언하고 그 SQL 문자열을 실행해야합니다 생각합니다.
sp_executesql을에서보세요
from https://stackoverflow.com/questions/1707326/define-variable-to-use-with-in-operator-t-sql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL Server의 DD / MMM / YYYY 형식으로 변환 날짜 형식 (0) | 2020.04.24 |
---|---|
[SQL] 구분 기호와 저장 프로 시저 구문을 만들 MYSQL (0) | 2020.04.24 |
[SQL] 실행 SELECT 문을 죽이는 방법 (0) | 2020.04.24 |
[SQL] 어떻게 PowerShell을 사용 .SQL 파일을 실행하려면? (0) | 2020.04.23 |
[SQL] 페이징 SQL Server 2005의 결과 (0) | 2020.04.23 |