developer tip

WHERE col IN (…) 조건에 대한 제한

copycodes 2020. 11. 24. 08:06
반응형

WHERE col IN (…) 조건에 대한 제한


다음 코드를 사용하고 있습니다.

SELECT * FROM table
WHERE Col IN (123,123,222,....)

그러나 IN에 ~ 3000 개 이상의 숫자를 입력하면 SQL에서 오류가 발생합니다.

크기 제한이나 비슷한 것이 있는지 아는 사람 있나요? !!


사용중인 데이터베이스 엔진에 따라 명령어 길이에 제한이있을 수 있습니다.

SQL Server에는 매우 큰 제한이 있습니다.

http://msdn.microsoft.com/en-us/library/ms143432.aspx

ORACLE은 다른 쪽에서 한계에 도달하기가 매우 쉽습니다.

따라서 큰 IN 절의 경우 임시 테이블을 만들고 값을 삽입하고 JOIN을 수행하는 것이 좋습니다. 또한 더 빠르게 작동합니다.


제한이 있지만 값을 in ()의 개별 블록으로 분할 할 수 있습니다.

Select * 
From table 
Where Col IN (123,123,222,....)
or Col IN (456,878,888,....)

쿼리를 매개 변수화하고 테이블 값 매개 변수 를 사용하여 ID를 전달합니다 .

예를 들어, 다음 유형을 정의하십시오.

CREATE TYPE IdTable AS TABLE (Id INT NOT NULL PRIMARY KEY)

다음 저장 프로 시저와 함께 :

CREATE PROCEDURE sp__Procedure_Name
    @OrderIDs IdTable READONLY,
AS

    SELECT *
    FROM table
    WHERE Col IN (SELECT Id FROM @OrderIDs)

버전에 따라 2008 년에 테이블 값 매개 변수를 사용하거나 여기에 설명 된 몇 가지 접근 방식을 사용합니다.

SQL Server 2005의 배열 및 목록


하위 선택에서 where IN을 수행하지 않는 이유는 무엇입니까?

임시 테이블 등으로 사전 쿼리 ...

CREATE TABLE SomeTempTable AS
    SELECT YourColumn
    FROM SomeTable
    WHERE UserPickedMultipleRecordsFromSomeListOrSomething

그때...

SELECT * FROM OtherTable
WHERE YourColumn IN ( SELECT YourColumn FROM SomeTempTable )

문제의 데이터베이스 엔진을 지정하지 않았습니다. Oracle에서 옵션은 다음과 같은 튜플을 사용하는 것입니다.

SELECT * FROM table WHERE (Col, 1) IN ((123,1), (123,1), (222,1), ....)

이 추악한 해킹은 Oracle SQL에서만 작동합니다. https://asktom.oracle.com/pls/asktom/asktom.search?tag=limit-and-conversion-very-long-in-list-where-x-in# 참조 9538075800346844400

그러나 훨씬 더 나은 옵션은 저장 프로 시저를 사용하고 값을 배열로 전달하는 것입니다.


다음과 같은 튜플을 사용할 수 있습니다. SELECT * FROM table WHERE (Col, 1) IN ((123,1), (123,1), (222,1), ....)

이들의 수에는 제한이 없습니다. 쌍을 비교합니다.

참고 URL : https://stackoverflow.com/questions/1069415/limit-on-the-where-col-in-condition

반응형