我正在运行查询,并尝试从表B中获取订单,这些订单包含在表A的订单列表中。 只有订单列表中只有一个元素,我才能获得结果
select *
from A,B
where substr(B.order,6,1) in A.orders
答案 0 :(得分:1)
您需要适当的表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)
将从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