Разница между двумя неупорядоченными разделенными списками (Oracle) - PullRequest
1 голос
/ 17 апреля 2011

Существует ли простой элегантный метод для возврата разницы между двумя неупорядоченными списками с разделителями в Oracle?

Пример:

  • Список A: a1, b4, g3, h6,t8, a0
  • Список B: b4, h6, a0, t8, a1

Разница: g3

1 Ответ

3 голосов
/ 18 апреля 2011

Если у вас есть доступ к APEX_UTIL, вы можете проанализировать строки в массив, преобразовать их в коллекции, а затем использовать MULTISET EXCEPT (то же самое, что и MINUS, но для коллекций):

SET SERVEROUT ON
DECLARE
  TYPE set_t IS TABLE OF varchar2(100);
  listA APEX_APPLICATION_GLOBAL.vc_arr2;
  listB APEX_APPLICATION_GLOBAL.vc_arr2;
  excpt set_t;
  FUNCTION to_set_t (arr IN APEX_APPLICATION_GLOBAL.vc_arr2)
    RETURN set_t IS
    rset set_t := set_t();
  BEGIN
    rset.EXTEND(arr.COUNT);
    FOR i IN 1..arr.COUNT LOOP
      rset(i) := TRIM(arr(i));
    END LOOP;
    RETURN rset;
  END;
BEGIN
  -- parse lists into arrays
  listA := APEX_UTIL.string_to_table('a1, b4, g3, h6, t8, a0',',');
  listB := APEX_UTIL.string_to_table('b4, h6, a0, t8, a1',',');
  -- convert arrays to collections, then do the minus
  excpt := to_set_t(listA) MULTISET EXCEPT to_set_t(listB);
  -- display the results
  FOR i IN 1..excpt.COUNT LOOP
    DBMS_OUTPUT.put_line(excpt(i));
  END LOOP;
END;

Результат:

g3

Больше информации об операторах MULTISET, которые были представлены в 10g: http://www.oracle -developer.net / display.php? Id = 303

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...