2014-11-10 2 views
1

У меня есть список значений, и я хочу запросить, какие значения в этом списке НЕ отображаются в определенном столбце в базе данных Oracle (не знаете, какая версия).Определить, какие значения отсутствуют в столбце базы данных Oracle

Так, например, если мой список значений A,B,C и у меня есть таблица, как показано ниже:

-------- 
|COLUMN| 
-------- 
|  C| 
|  A| 
-------- 

В результате я бы ожидать, будет B.

До сих пор мой подход был SQL-запрос похож на ниже:

SELECT <<List of values SQL, not sure what goes here>> 
EXCEPT 
SELECT column FROM table 

Однако я не знаю, что SQL для первого оператора выглядит. До сих пор я придумал:

SELECT "A","B","C" FROM dual 

Но это не имеет желаемого эффекта, поскольку он создает 3 колонки

Еще один момент упомянуть о том, что в реальной задаче существует около 100 записей в список для поиска, а не три в примере игрушек выше.

ответ

3

Может быть, это помогает: решение

WITH static_list AS (
    SELECT 'A' AS v FROM dual UNION ALL 
    SELECT 'B' AS v FROM dual UNION ALL 
    SELECT 'C' AS v FROM dual 
) 
SELECT v FROM static_list 
MINUS (SELECT column 
      FROM table); 
+0

Одно дело, что фактический список значений намного больше, около 112 значений, так что вы в конечном итоге с большим С заявлением , Попробуем это решение. – ahjmorton

+0

Вы можете создать отдельную таблицу и вставить в нее свои значения. Затем вы заменяете 'static_list' этой новой таблицей. – DirkNM

+0

Я думаю, вы могли бы сделать это с помощью временной таблицы, я не в ситуации, когда я могу легко создавать новые постоянные таблицы. Я закончил использование инструкции WITH с большим количеством выборок, поэтому принимаю – ahjmorton

0

Дирка работает отлично. Тем не менее, регулярные выражения могут также быть использованы для достижения этой цели для Oracle 10g и выше:

SELECT trim(regexp_substr(str, '[^,]+', 1, level)) str 
FROM (SELECT 'A,B,C,D' str from dual) 
CONNECT BY instr(str, ',', 1, level - 1) > 0 
Minus 
Select column from table 
Смежные вопросы