Проверка данных столбца, сохраненных как CSV, против другой таблицы - PullRequest
1 голос
/ 08 марта 2010

Я хотел посмотреть, какими будут некоторые предлагаемые подходы для проверки поля, которое хранится в виде CSV, с таблицей, содержащей соответствующие значения.Несмотря на то, что это было бы желательно, это НЕ вариант разбить список CSV на другую связанную таблицу.В приведенных ниже примерах данных я бы попытался захватить код 99 для виджета A.

Ниже приведен пример представления данных.

Table: Widgets

WidgetName   WidgetCodeList
A            1, 2, 3
B            1
C            2, 3
D            99

Table: WidgetCodes

WidgetCode  
1
2
3

Более ранний подход заключался в запросе столбца CSV какстрок с использованием различных манипуляций со строками и CONNECT_BY_LEVEL, однако производительность не была приемлемой.

Ответы [ 2 ]

1 голос
/ 08 марта 2010

Вы можете попробовать конвейерную функцию (здесь с боковым соединением):

SQL> WITH widgets AS (
  2     SELECT 'A' WidgetName, '1, 2, 3' WidgetCodeList FROM dual
  3     UNION ALL SELECT 'B', '1' FROM DUAL
  4     UNION ALL SELECT 'C', '2, 3' FROM DUAL
  5     UNION ALL SELECT 'D', '99' FROM DUAL
  6  ), widgetcodes AS (
  7     SELECT ROWNUM widgetcode from dual CONNECT BY LEVEL <= 3
  8  )
  9  SELECT w.widgetname,
 10         to_number(s.column_value) missing_widget
 11    FROM widgets w
 12         CROSS JOIN TABLE(demo_pkg.string_to_tab(w.WidgetCodeList)) s
 13   WHERE NOT EXISTS (SELECT NULL
 14                       FROM widgetcodes ws
 15                      WHERE ws.widgetcode = to_number(s.column_value));

WIDGETNAME MISSING_WIDGET
---------- --------------
D                      99

См. этот другой SO для примера конвейерной функции, которая преобразует строку символов в таблицу.

0 голосов
/ 08 марта 2010

В PL / SQL вы можете использовать утилиту Apex для преобразования строки с разделителями в коллекцию PL / SQL, например:

procedure validate_csv (p_csv varchar2)
is
   v_array apex_application_global.vc_arr2;
   v_dummy varchar2(1);
begin
   v_array := apex_util.string_to_table(p_csv, ', ');
   for i in 1..v_array.count
   loop
      begin
         select null
         into   v_dummy
         from   widgetcodes
         where  widgetcode = v_array(i);
      exception
         when no_data_found then
            raise_application_error('Invalid widget code: '||v_array(i));
      end;         
   end loop;
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...