2012-02-23 3 views
0

특정 데이터베이스 테이블의 열에 해당하는 varchar 값이있는 sql 쿼리를 설정하고 싶습니다. 결과는 이 아닌 모든 값을 테이블 열에으로 제공해야합니다. 이 같은컬렉션의 어떤 요소가 테이블의 열에 없는지 선택하십시오.

뭔가 :이 짝수 경우

SELECT x.a 
FROM (SELECT ('1','2','3') AS a) x 
WHERE x not in ( 
        SELECT knr 
        FROM table 
       ) 

내가 내 선택이 하나의 레코드로 취급되기 때문에이 작업을하지 않았다 나는 바로 그것을 설정하는 방법을 알고하지 않거나 가능한.

아무에게도이 자료를 보관하는 방법에 대한 힌트를 줄 수 있습니까? 당신이 사용할 수 있도록도, 포스트 그레스는 Table Values Constructor 구문을 구현했습니다

select X.A 
from 
    (select '1' as A union select '2' as A union select '3' as A) x 

where A not in (select knr from table1) 

답변

2
SELECT x.a 
FROM 
    (SELECT '1' AS a 
    UNION ALL 
     SELECT '2' 
    UNION ALL 
     SELECT '3' 
    ) x 
WHERE a NOT IN 
     (SELECT knr FROM table1) 

:

+0

내가 기억할 수있는 한'VALUES' 절이 PostgreSQL에서 작동하고 있습니다. 나는 최근 버전 8.4에서 사용했지만, 아마도 오래전에 사용했다. –

+0

@ 에림 : Thnx, 나는 그것을 바로 잡을 것이다. 나는 그것도 가지고 있다고 생각했지만, "Postgres Table Values ​​Constructor"*에 대한 빠른 검색을 게시 한 시간에는 아무런 결과도 얻지 못했습니다. –

+0

답변을 주셔서 감사합니다. 두 번째 쿼리는 내 요구 사항에 완벽하게 부합합니다. 첫 번째는 더 일반적입니다. 왜냐하면 where 절에서 x를 x.a로 바꾸면 mysql과 mssql에서도 작동하기 때문입니다. – acoder

1

이 시도

SELECT x.a 
FROM 
    (VALUES 
     ('1'), 
     ('2'), 
     ('3') 
    ) AS x(a) 
WHERE a NOT IN 
     (SELECT knr FROM table1) 
1

당신은 또한 당신의 구문을 단축하는 기능 regexp_split_to_table()을 사용할 수 있습니다 :

SELECT x 
FROM regexp_split_to_table('1~2~3', '~') AS x 
LEFT JOIN tbl t ON t.knr = x 
WHERE t.knr IS NULL 

구분 기호로 문자열을 사용하여 값의 일부가 아닌 것을 보장합니다.
tbl.knr이 실제로 문자열 유형 인 경우 text 인 경우에만 작동합니다. text를 들어,

SELECT x 
FROM regexp_split_to_table('1~2~3', '~') AS x 
LEFT JOIN tbl t ON t.knr = x::int 
WHERE t.knr IS NULL 

을 또는 :

이 경우, 사실, integer 같은 숫자 유형 대신 할

SELECT x 
FROM regexp_split_to_table('1~2~3', '~') AS x 
WHERE NOT EXISTS (SELECT * FROM tbl t WHERE t.knr = x) 

integer의 경우 :

SELECT x 
FROM regexp_split_to_table('1~2~3', '~') AS x 
WHERE NOT EXISTS (SELECT * FROM tbl t WHERE t.knr = x::int) 
관련 문제