Oracle Query: Как сравнить два столбца в другой таблице со значениями, разделенными запятыми - PullRequest
0 голосов
/ 03 октября 2019

Как сравнить два prod_name столбца из разных таблиц, которые имеют значения, разделенные запятыми?

Эти столбцы имеют значения, разделенные запятыми, в другом порядке. Чтобы найти совпадение, все значения должны совпадать с другими значениями столбца таблицы prod_name.

Другими словами, значения могут существовать в разных порядках в столбцах, и это не имеет значения какпока все значения, разделенные запятыми, представлены в обоих столбцах.

TABLE 1:
PRODUCT_ID                         PROD_NAME
================================================
1                                   O,G,E,H,R  
2                                   P,D,H,P,N
3                                   C,D,A,D,P
4                                   E,D,A,D,P


TABLE 2:
PRODUCT_ID  PROD_NAME
======================
5          R,O,G,E H
6          P,D,H,N,P
7          C,D,A,D
8          C,D,A,P,D

Ожидаемый результат:

1 matches with 5
2 matches with 6
3 matches with 8

Ответы [ 3 ]

4 голосов
/ 03 октября 2019

Вы можете добиться этого, используя функции TRANSLATE и TRIM следующим образом.

SQL> with t1 as
  2  (select 1 as product_id, 'O,G,E,H,R' as prod_name from dual union all
  3  select 2, 'P,D,H,P,N' from dual union all
  4  select 3, 'C,D,A,D,P' from dual union all
  5  select 4, 'E,D,A,D,P' from dual),
  6  t2 as
  7  (select 5 as product_id, 'R,O,G,E,H' as prod_name from dual union all
  8  select 6 as product_id, 'P,D,H,N,P' as prod_name from dual union all
  9  select 7 as product_id, 'C,D,A,D' as prod_name from dual union all
 10  select 8 as product_id, 'C,D,A,P,D' as prod_name from dual)
 11  SELECT
 12      T1.PRODUCT_ID,
 13      T2.PRODUCT_ID
 14  FROM
 15      T1
 16      JOIN T2 ON TRIM('#' FROM TRANSLATE(T1.PROD_NAME, T2.PROD_NAME, '#')) IS NULL;

PRODUCT_ID PRODUCT_ID
---------- ----------
         1          5
         2          6
         3          8

SQL>

Этот запрос считает, что ваше имя_продукта не имеет символа # ни в одном из значений.

Ура !!

1 голос
/ 11 октября 2019

Лучше бы, чтобы в одном атрибуте не было значений, разделенных запятыми. Первое правило нормализации базы данных гласит, что один атрибут не может содержать несколько значений, они должны быть разбиты на несколько кортежей, причем каждый кортеж содержит одно значение этого атрибута.

1 голос
/ 03 октября 2019

У вас очень плохая структура данных. Однако Oracle обладает некоторыми мощными возможностями регулярных выражений. Предполагая, что у вас нет дубликатов, я думаю, что это работает:

select t1.product_id, t2.product_id
from table1 t1 join
     table2 t2
     on regexp_count(t2.prod_name, replace(t1.prod_name, ',', '|')) =
        regexp_count(t1.prod_name, replace(t1.prod_name, ',', '|'));

На самом деле, это также работает для дубликатов, но оно проверяет количество дубликатов.

Здесь это дБ <> скрипка.

...