2012-11-08 2 views
0

Я хочу сравнить столбец, разделенный запятыми, в таблице оракула с другим разделенным запятыми столбцом в другой таблице. Если все значения (в столбце, разделенном запятыми и независимо от их порядка) в столбце один содержатся в столбце два, он не должен возвращать эту строку.Сравните два столбца с разделителями-запятыми в двух разных таблицах оракула

Например -

  1. Колонка 1 имеет, Ь, с, DEF Колонка 2 имеет, C, B

    Это не должно быть возвращено в виде, С и В в колонке 2 содержатся в колонке 1 независимо от их заказа.

  2. Колонка 1 имеет, кл, OWD Колонка 2 имеет, OWD, стр

    Эта строка должна быть возвращена, так как столбец 2 имеет «РР», который не является , содержащейся в колонке 1.

  3. Колонка 1 имеет vvv, ccc, rr Столбец 2 имеет ccc, rr

    Эта строка не может быть возвращена.

Могу ли я выполнить это в SQL? Не ожидая процедуры или функции.

Спасибо за помощь!

+0

Эти правила довольно запутывают, описание в тексте по сравнению с примерами не соответствует. – Andrew

+4

Вы не должны хранить значения, разделенные запятыми, в одном столбце в первую очередь. Было бы лучше, если бы вы переработали свою базу данных (т. Е. Решили первопричину) вместо того, чтобы бороться с симптомами неправильного дизайна. –

ответ

2

Во-первых: Я думаю, что ваш пример не соответствует вашему вопросу.

Но сконцентрировавшись на вашем вопросе: Если все значения (в столбце, разделенном запятыми и независимо от их порядка) в столбце один содержатся в столбце два, он не должен возвращать эту строку.

Вам нужно разобрать CSV в набор (regexp_substr части), а затем проверить, если набор из колонки два полностью содержит набор из колонки одного (minus части):

SELECT * 
    FROM csv 
WHERE EXISTS 
     (SELECT REGEXP_SUBSTR (col1, '[^,]+', 1, ROWNUM) 
      FROM DUAL 
      CONNECT BY ROWNUM <= LENGTH (col1) - LENGTH (REPLACE (col1, ',')) + 1 
      MINUS 
      SELECT REGEXP_SUBSTR (col2, '[^,]+', 1, ROWNUM) 
      FROM DUAL 
      CONNECT BY ROWNUM <= LENGTH (col2) - LENGTH (REPLACE (col2, ',')) + 1 
     ) 
; 

См http://www.sqlfiddle.com/#!4/3cdb3/1 для рабочего примера.

Смежные вопросы