두 개의 열이있는 위치 선택


35

이것은 어리석은 질문 일 수도 있지만, 나는 이것을 할 수 없지만 SQL에 다음과 같은 작업을 수행 할 수있는 구조가 있다는 의혹이 있습니다.

SELECT whatever WHERE col1,col2 IN ((val1, val2), (val1, val2), ...)

두 개의 열이 한 쌍의 세트에있는 데이터를 선택하고 싶습니다.

가능한 경우 하위 쿼리를 사용하지 않으려 고합니다.

답변:


47

SQL에 다음과 같은 작업을 수행 할 수있는 구문이 있습니까?

네, 당신이 쓴 것과 거의 동일합니다. col1, col2괄호 안에 넣으십시오 .

-- works in PostgreSQL, Oracle, MySQL, DB2, HSQLDB 
SELECT whatever 
FROM t                               --- you missed the FROM
WHERE (col1, col2)                    --- parentheses here
       IN ((val1a, val2a), (val1b, val2b), ...) ;

그러나 DBMS에서 시도하면 작동하지 않을 수 있습니다. 모든 DBMS가 (진화하는) SQL 표준의 모든 기능을 구현 한 것은 아니기 때문입니다. 이것은 최신 버전의 Oracle, MySQL, Postgres, DB2 및 HSQLDB에서 작동합니다 (MySQL에서는 잘 최적화되지 않았고 인덱스를 사용하지 않으므로 5.7에서 수정하지 않으면 피해야합니다).

IN연산자 에 대한 MySQL 설명서 와 Row 생성자 에 대한 Postgres 설명서를 참조하십시오 . 괄호 안의 두 개 이상의 값을 행 생성자 라고합니다 .

같은 생각을 표현하는 다른 방법들 :

-- works in PostgreSQL, DB2
SELECT whatever 
FROM t 
WHERE (col1, col2) 
       IN ( VALUES (val1a, val2a), (val1b, val2b), ...) ;

SELECT t.whatever 
FROM t 
  JOIN 
    ( VALUES (val1a, val2a), (val1b, val2b), ...) AS x (col1, col2)
      ON (x.col1, x.col2) = (t.col1, t.col2) ;

둘 다 Postgres와 DB2 (afaik)에서 작동합니다. 마지막 것은 SQL Server에서도 작동하도록 수정할 수 있습니다.

-- works in PostgreSQL, DB2, SQL Server
SELECT t.whatever 
FROM t 
  JOIN 
    ( VALUES (val1a, val2a), (val1b, val2b), ...) AS x (col1, col2)
      ON  x.col1 = t.col1
      AND x.col2 = t.col2 ;

값을 (임시 또는 영구) 테이블에 먼저 배치하여 모든 곳에서 작동하도록 수정할 수도 있습니다.

-- works everywhere
CREATE TABLE values_x
( col1  ...,
  col2  ...) ;

-- use appropriate for the DBMS syntax here
INSERT INTO values_x (col1, col2)
VALUES (val1a, val2a), (val1b, val2b), ... ;

SELECT t.whatever 
FROM t 
  JOIN values_x  x 
      ON  x.col1 = t.col1
      AND x.col2 = t.col2 ;

DROP TABLE values_x ;

그리고 항상 긴 방법이 있거나 IN긴 표현으로 변환하여 OR어디에서나 작동해야합니다.

-- works in all SQL DBMS
SELECT whatever 
FROM t  
WHERE col1 = val1a AND col2 = val2a
   OR col1 = val1b AND col2 = val2b
   ---
   ;

* : 실제로는 하나의 값일 수 있습니다 ( ROW(v)Postgres 문서 참조).


에 대한 설명서는 어디서 찾을 수 있습니까 WHERE (x, y) IN (a,b)? MySql을 사용하고 있습니다. 아마도이 구조가 무엇인지 모릅니다.
Robert Rocha

1
@RobertRocha 내가 추가 한 링크를 참조하십시오. : 그것은 행 생성자라고 MySQL이 :IN행 생성자 : 포스트 그레스
ypercubeᵀᴹ

또한 있습니다 WHERE EXISTS (SELECT t.col1, t.col2 [FROM DUAL] INTERSECT VALUES(val1, val2), (…, …), …).
Andriy M

-4
SELECT * 
FROM   dbo.Table1 A
WHERE  (CAST(Column1 AS VARCHAR(max)) + '-' + CAST(Column2 AS varchar(max)))
NOT IN (SELECT (CAST(Column1 AS VARCHAR(max)) 
                + '-' 
                + CAST(Column2 AS varchar(max))) 
        FROM Table2)

2
즉 안정적으로 작동하지 않을
a_horse_with_no_name

2
예. 비 효율성 외에도, 그것을 구별 할 수 없습니다 'a-b', 'c''a', 'b-c'. 그리고로 변환 할 수없는 모든 유형에 대해 비참하게 실패합니다 varchar(max).
ypercubeᵀᴹ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.