Значения столбца тега, содержащиеся в других строках - PullRequest
0 голосов
/ 07 января 2020

Предположим, у меня есть следующая таблица:

+-----------+--------------+----------------+------------------+
| tableName | duplicate_Id |   Index_name   |   Column_List    |
+-----------+--------------+----------------+------------------+
| foo       |            1 |    foo_index_1 | fafa, fifi, fufu |
| foo       |            2 |    foo_index_2 | fafa, fifi       |
| bar       |            1 |    bar_index_1 | bubu, bebe       |
| bar       |            2 |    bar_index_2 | bubu             |
| bar       |            3 |    bar_index_3 | bebe             |
+-----------+--------------+----------------+------------------+

Я хочу знать для каждой строки каждой таблицы, содержится ли ее значение Column_List в другой строке того же самого таблица (считается содержащейся, если шаблон соответствует X%, а не только% X%).

В качестве желаемого результата я получу:

+-----------+--------------+----------------+------------------+-----------+
| tableName | duplicate_Id |   Index_name   |   Column_List    | Contained |
+-----------+--------------+----------------+------------------+-----------+
| foo       |            1 |    foo_index_1 | fafa, fifi, fufu | false     |
| foo       |            2 |    foo_index_2 | fafa, fifi       | true      | (true, contained within id 1 of same table)
| bar       |            1 |    bar_index_1 | bubu, bebe       | false     |
| bar       |            2 |    bar_index_2 | bubu             | true      | (true, contained within id 1 of same table)
| bar       |            3 |    bar_index_3 | bebe             | false     | (false, 'bebe%' doesn't match 'bubu,bebe'
+-----------+--------------+----------------+------------------+-----------+

Я был бы очень признателен за помощь или подсказки здесь.

Ответы [ 2 ]

1 голос
/ 07 января 2020

С EXISTS и оператором LIKE:

select t.*,
  case when exists (
      select 1 from tablename
      where Column_list like t.Column_list + ',%'
    ) then 'true'
    else 'false'
  end Contained
from tablename t

Я предполагаю, что вы хотите сопоставить только начало столбца. Смотрите демо . Результаты:

> tableName | duplicate_Id | Index_name  | Column_List      | Contained
> :-------- | -----------: | :---------- | :--------------- | :--------
> foo       |            1 | foo_index_1 | fafa, fifi, fufu | false    
> foo       |            2 | foo_index_2 | fafa, fifi       | true     
> bar       |            1 | bar_index_1 | bubu, bebe       | false    
> bar       |            2 | bar_index_2 | bubu             | true     
> bar       |            3 | bar_index_3 | bebe             | false 
1 голос
/ 07 января 2020

Хммм. , , Казалось бы, это делает то, что вы хотите:

select i.*,
       (case when exists (select 1
                          from input i2
                          where concat(', ', i2.column_list, ', ') like concat('%, ', i.column_list, ', %') and
                                i2.column_list <> i.column_list
                         )
             then 'true' else 'false'
        end) as flag
from input i;

Обратите внимание, что если вы интерпретируете эту строку как список элементов, , то вам следует исправить свою модель данных . Не храните списки в виде строк. SQL имеет отличный способ хранения списков - он называется "таблицей".

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