2012-02-23 7 views
0

私は特定のデータベーステーブルの列に対応するvarchar値の束を持っているsqlクエリを設定したいと思います。結果は、テーブルの列にではないのすべての値を私に与える必要があります。このようなコレクションのどの要素がテーブルの列にないのかを選択してください

何か:

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

内側の選択は、私は右のそれを設定する方法がわからない、またはこれが偶数の場合、単一のレコードとして扱われているので、私はこれが動作するために取得していません可能。

誰でも私にこれをアーカイブするヒントを教えてもらえますか?あなたがこれを使用することができますので、あまりにも、Postgresは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

あなたの答えをありがとう、2番目のクエリは私のニーズに完全に動作します。最初の方がより一般的です。なぜなら、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) 
関連する問題