oracle sql: проверка отдельных элементов в списке значений на наличие в таблице

#oracle #layout

#Oracle #макет

Вопрос:

Кто-то отправил мне по почте список с кодами, и мне нужно проверить, существует ли каждый код в таблице базы данных Oracle 10.

список выглядит примерно так:

 code1, code2, code3
  

Конечно, для каждого элемента в списке я могу сделать

 select id from my_table where code = 'code1'.
  

Но это заняло бы много времени и не очень элегантно. Я хотел бы представить список, подобный:

 code1        present
code2        X
code3        X
code4        present
  

Я смутно осведомлен о инструкции oracle With, но я не уверен, как использовать ее со списком значений вместо подзапроса.

Ответ №1:

Обратное может быть достигнуто следующим образом (просмотрите все коды из базы данных и проверьте, есть ли они в списке, предоставленном вашим коллегой):

 select code, case when code in ('code1', 'code2', 'code3') 
                  then 'present' 
                  else 'X' end
from my_table;
  

Если у вас это не сработает, вы можете попробовать это:

 -- you need a special type for your request. Adapt dimensions if necessary
create type codes as varray(100) of varchar(100);

select c.column_value, case when exists (
  select 1 
  from my_table m 
  where m.code = c.column_value
) then 'present' else 'X' end
from table(codes('code1', 'code2', 'code3')) c;

-- drop that type again
drop type codes;
  

Комментарии:

1. Это не вернет ‘code2 X’, если code2 отсутствует в таблице. Это делает обратное!

2. Большое спасибо за ваше объяснение, first действительно сработал для меня, но мой список был немного длиннее, чем ожидалось.