выберите, какой элемент коллекции не находится в столбце таблицы - PullRequest
0 голосов
/ 23 февраля 2012

Я хотел бы настроить SQL-запрос, в котором у меня есть набор значений varchar, соответствующих столбцу конкретной таблицы базы данных.Результат должен дать мне все значения, которые не в столбце таблицы.

Примерно так:

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

Я не получил это работать, потому чтоВнутренний выбор рассматривается как отдельная запись, я не знаю, как правильно ее настроить, или если это вообще возможно.

Может кто-нибудь подсказать, как это заархивировать?

Ответы [ 3 ]

2 голосов
/ 23 февраля 2012
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 )

В Postgres реализован синтаксис Конструктор табличных значений *1003*, поэтому вы также можете использовать его:

SELECT x.a 
FROM
    ( VALUES 
        ('1'), 
        ('2'),
        ('3')
    ) AS x(a) 
WHERE a NOT IN
      ( SELECT knr FROM table1 )
1 голос
/ 24 февраля 2012

Вы также можете использовать функцию 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.

Если это, на самом деле, числовой тип , такой как integer do вместо:

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

Или, для text:

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)
1 голос
/ 23 февраля 2012

попробуйте это:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...