Оператор SQL IN не работает со значениями, разделенными запятыми - PullRequest
1 голос
/ 11 июля 2019

Я выполняю свой запрос и пытаюсь получить заказы из таблицы B, которые включены в список заказов в таблице A. Я получаю результаты, только если в списке заказов есть только один элемент

select *
from A,B
where substr(B.order,6,1) in A.orders

Table A Table B Result

Ответы [ 2 ]

1 голос
/ 11 июля 2019

Вам нужны правильные join таблиц и оператор like:

select A.id, B.order
from A inner join B
on ',' || A.orders || ',' like '%,' || substr(B.order,6,1) || ',%' 

Примечание. Я думаю, что DB2 поддерживает оператор || для объединения.
Если нет:

select A.id, B.order
from A inner join B
on concat(concat(',', A.orders), ',') like concat(concat('%,', substr(B.order,6,1)), ',%') 

Примечание: substr(B.order,6,1) вернет 1 символ из B.order, но если у вас числа больше 9, вам следует использовать:

substr(B.order,6)

возвращает все символы, начиная с 6-й позиции и заканчивая B.order

0 голосов
/ 11 июля 2019
CREATE FUNCTION [dbo].[ConvertStringToTable] (@String_IN VARCHAR(MAX))
RETURNS @Temp TABLE
   (id int not null)
AS
BEGIN
    ;-- Ensure input ends with comma
    SET @String_IN = REPLACE(@String_IN + ',', ',,', ',')
    DECLARE @Place INT
    DECLARE @VALUE VARCHAR(1000)
WHILE PATINDEX('%,%', @String_IN ) <> 0 
BEGIN
   SELECT  @Place = PATINDEX('%,%',@String_IN)
   SELECT  @VALUE = LEFT(@String_IN , @Place - 1)
   SELECT  @String_IN = STUFF(@String_IN, 1, @Place, '')
   INSERT INTO @Temp(id) VALUES (@VALUE)
END
    RETURN
END
GO

Для использования функции

SELECT a.id, b.order
   FROM a,b 
   WHERE substr(b.order,6,1) IN (SELECT * FROM [MillWorks].[ConvertStringToTable]          (a.orders) )

Результаты: 1 заказ1 1 заказ2 1 заказ3 1 заказ4 1 заказ5 2 заказ3 2 порядка5 2 заказ6 3 заказ2 3 заказ4 4 порядка5

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