SQL IN语句不适用于逗号分隔的值

时间:2019-07-11 14:53:59

标签: sql db2

我正在运行查询,并尝试从表B中获取订单,这些订单包含在表A的订单列表中。 只有订单列表中只有一个元素,我才能获得结果

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

Table A Table B Result

2 个答案:

答案 0 :(得分:1)

您需要适当的表joinlike运算符:

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)将从B.order返回1个字符,但是如果您的数字大于9,则应使用:

substr(B.order,6)

这将从第6个位置开始直到B.order的末尾返回所有字符。

答案 1 :(得分:-1)

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