SQL частичное совпадение подзапроса - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь запустить выбор, который частично соответствует результатам другого выбора. Кажется, что все, что я делаю, не дает того, что я хочу.

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

List
-----------
item1,item2,item3

Затем у меня есть другое table (строки) со столбцом, содержащим элементы 1-3 и другие, которые я хочу отфильтровать. Это то, что я пытаюсь, но не могу заставить его работать.

Select lineitems.itemnumber from lineitems,productlines
where productlines.list like concat('%',(select list from productlines),'%')

Результат показывает все в lineitems.itemnumber, а не только элементы 1-3.

Ответы [ 3 ]

0 голосов
/ 06 мая 2020

Думаю, это то, что вам нужно.

SELECT lineitems.itemnumber 
FROM lineitems
WHERE EXISTS (  
    SELECT *
    FROM productlines
    WHERE productlines.list LIKE '%' + lineitems.itemnumber + '%'
)

В качестве альтернативы вы можете string_split работать, как показано ниже (обратите внимание, что это может повлиять на производительность)

SELECT lineitems.itemnumber
FROM lineitems, productlines
WHERE EXISTS (  
    SELECT *
    FROM productlines
        CROSS APPLY string_split(productlines.list, ',') AS splitted_itemnumber
    WHERE splited_itemnumber.value = lineitems.itemnumber
)
0 голосов
/ 06 мая 2020

Я бы порекомендовал:

select li.itemnumber
from lineitems li
where exists (select 1
              from productlines pl
              where concat(',', pl.list, ',') like concat('%,', li.itemnumber,',%')
             );

Это включает в себя разделители, поэтому вы не получите ложных совпадений.

Вы также можете использовать string_split():

select li.itemnumber
from lineitems li
where exists (select 1
              from productlines pl cross apply
                   string_split(pl.list, ',') s
              where s.value = li.itemnumber,',%'
             );
0 голосов
/ 06 мая 2020

Вы не указали свою СУБД, но в Postgres можно примерно так:

select li.itemnumber
from lineitems li
  join productlines pl on li.item_id = any(string_to_array(pl.list, ','))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...