복붙노트

[SQL] SQL "IN"절에 튜플을 사용하여

SQL

SQL "IN"절에 튜플을 사용하여

나는 필드를 포함하는 테이블이 GROUP_ID 및 group_type하고 난 튜플의 목록에서 어떤 튜플 (그룹 ID, 그룹 유형)를 가진 모든 레코드의 테이블을 조회 할. 예를 들어, 내가 좋아하는 뭔가를 할 수 있도록하려면 :

SELECT *
FROM mytable
WHERE (group_id, group_type) IN (("1234-567", 2), ("4321-765", 3), ("1111-222", 5))

절에 SQL에 튜플을 사용하지만,이 솔루션은 튜플 목록이 다른 테이블에서 페치 될 것입니다 거기에 가정 제안 : 매우 비슷한 질문은 이미에 요청합니다. 내 경우에는 작동하지 않습니다이 튜플 값이 하드 코딩되어있다.

한 가지 해결책은 사용 문자열 연결하는 것입니다 :

SELECT *
FROM mytable
WHERE group_id + STR(group_type, 1) IN ("1234-5672", "4321-7653", "1111-2225")

그러나 문제는 테이블이 매우 크고 매우 비싼 것이 각 레코드에 대한 문자열 연결 및 전환을하는 것입니다.

어떠한 제안?

해결법

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

    1.왜 OR 문을 구성하지?

    왜 OR 문을 구성하지?

    SELECT *
    FROM mytable 
    WHERE (group_id = '1234-567' and group_type = 2)
        OR (group_id = '4321-765' and group_type = 3)
        OR (group_id = '1111-222' and group_type = 5)
    

    부여, 그것은 좋은 개념에 예로서 깔끔한로 보지 않고는 일을 할 것입니다 (그리고 경우 튜플이 존재했다과 함께, 그것은 가장 가능성이 내부적으로 정확히 같은 방식으로 그것을 구현하는 것입니다.

  2. ==============================

    2.아주 작은 비틀기를 (단일 이중 따옴표를 교체하고 VALUES 키워드를 추가)을 감안할 때, 귀하가 제안하는 구문은 유효한 표준 SQL-92 구문이 즉

    아주 작은 비틀기를 (단일 이중 따옴표를 교체하고 VALUES 키워드를 추가)을 감안할 때, 귀하가 제안하는 구문은 유효한 표준 SQL-92 구문이 즉

    SELECT *
      FROM mytable
     WHERE (group_id, group_type) IN (
                                      VALUES ('1234-567', 2), 
                                             ('4321-765', 3), 
                                             ('1111-222', 5)
                                     );
    

    슬프게도, MSFT는 SQL 서버에 추가하고 그것에게 '예상치 못한'기능을 고려하지 않았습니다.

    FWIW PostgreSQL을하고 SQLite는이 구문을 지원하는 SQL 제품의 예입니다.

  3. ==============================

    3.SQL Server 2008에서는 다음과 같이 할 수 있습니다

    SQL Server 2008에서는 다음과 같이 할 수 있습니다

    select *
    from mytable as T
    where exists (select *
                  from (values ('1234-567', 2), 
                               ('4321-765', 3), 
                               ('1111-222', 5)) as V(group_id, group_type)
                  where T.group_id = V.group_id and
                        T.group_type = V.group_type               
                 )
    
  4. ==============================

    4.이러한 튜플이 다른 테이블에있는 척하기 위해 공통 테이블 표현식을 사용할 수 있습니다 :

    이러한 튜플이 다른 테이블에있는 척하기 위해 공통 테이블 표현식을 사용할 수 있습니다 :

    ;WITH Tuples as (
         select '1234-567' as group_id, 2 as group_type union all
         select '4321-765', 3 union all
         select '1111-222', 5
    )
    SELECT * /* TODO - Pick appropriate columns */
    from mytable m where exists (
       select * from Tuples t
       where m.group_id = t.group_id and m.group_type = t.group_type)
    
  5. ==============================

    5.이 솔루션을 사용하여이 작업을해야합니다 :

    이 솔루션을 사용하여이 작업을해야합니다 :

    SELECT *
    FROM mytable m
    WHERE EXISTS (
       SELECT * FROM (
       SELECT "1234-567" group_id, 2 group_type UNION ALL
       SELECT "4321-765", 3 UNION ALL
       SELECT "1111-222", 5) [t]
       WHERE m.group_id = t.group_id AND m.group_type = t.group_type) 
    

    BTW, 당신은 아마 그 내부 테이블을 생성하기 위해 CTE를 사용해야합니다.

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

    6.여기에 조인을 사용하여 다른 튜플 솔루션입니다 :

    여기에 조인을 사용하여 다른 튜플 솔루션입니다 :

    SELECT 
      *
    FROM mytable m
    JOIN
    (
       SELECT "1234-567" group_id, 2 group_type 
       UNION ALL SELECT "4321-765", 3 
       UNION ALL SELECT "1111-222", 5
    ) [t]
    ON m.group_id = t.group_id 
    AND m.group_type = t.group_type
    
  7. ==============================

    7.나는 비슷한 문제가 있었다하지만 내 튜플 수집 동적했다 - 그것은 쿼리 매개 변수의 SQL 서버로 보내졌다. 나는 다음과 같은 해결책을했다 :

    나는 비슷한 문제가 있었다하지만 내 튜플 수집 동적했다 - 그것은 쿼리 매개 변수의 SQL 서버로 보내졌다. 나는 다음과 같은 해결책을했다 :

    그것은 조금 더 복잡한 질문에 설명 된 것보다 내 상황에서 잘 작동 보인다.

    이 t을 사용할 필요가 있음을 유의하십시오. * 대신 *와 노드 방법의 요구에서 반환 된 테이블의 (이 경우에는 그것의 튜플 (골)) 별칭을 지정할 수 있습니다.

  8. ==============================

    8.

    select * from table_name where 1=1 and (column_a, column_b) in ((28,1),(25,1))
    
  9. from https://stackoverflow.com/questions/8006901/using-tuples-in-sql-in-clause by cc-by-sa and MIT license