根据传递的逗号分隔值获取客户 ID 的存储过程
Stored procedure to get cutomer Ids on the basis of comma seperated value passed
项目Table:
id
item_name
code
cust_id
1
Mango
111
u1
2
Milk
112
u2
3
Chocolate
113
u3
4
Milk
112
u1
5
Mango
111
u2
6
Berry
114
u3
7
Chocolate
113
u1
8
Berry
114
u2
9
Ice-cream
114
u3
10
Mango
111
u4
这些是客户 table,我必须在 SQL 服务器中编写一个 存储过程 来找到已经购买的 cust_id所有项目都以逗号分隔值传递,例如 'Mango,Milk,Chocolate'
CREATE PROCEDURE Items_find
@items_value nvarchar(max)
AS
BEGIN
END
EXEC Items_find 'Mango,Milk,Chocolate'
EXEC Items_find 'Mango,Milk'
存储过程应该 return cust_id = u1
如果 'Mango,Milk'
那么输出应该是 cust_id=u1, u2
或者如果 'Mango'
那么输出是 cust_id=u1, u2, u3
我已经尝试过滤掉 cust_id
w.r.t。以逗号分隔传递的项目计数,但在那之后我找不到 cust_id
专门购买这些项目的人
DECLARE @InProducts VARCHAR(100);
--SET @InProducts='Mango,Milk,Chocolate';
SET @InProducts='Mango,Milk';
WITH CTE(id, item_name, code, cust_id) AS
(
SELECT 1,'MANGO',111,'U1'
UNION ALL
SELECT 2,'MILK',112,'U2'
UNION ALL
SELECT 3,'CHOCOLATE',113,'U3'
UNION ALL
SELECT 4,'MILK',112,'U1'
UNION ALL
SELECT 5,'MANGO',111,'U2'
UNION ALL
SELECT 6,'BERRY',114,'U3'
UNION ALL
SELECT 7,'CHOCOLATE',113,'U1'
UNION ALL
SELECT 8,'BERRY',114,'U2'
UNION ALL
SELECT 9,'ICE-CREAM',115,'U3'
UNION ALL
SELECT 10,'MANGO',111,'U4'
)
SELECT Z.CUST_ID FROM
(
SELECT C.*FROM CTE AS C
JOIN string_split(@InProducts,',')X ON C.item_name=X.value
)Z
GROUP BY Z.cust_id HAVING COUNT(Z.CUST_ID)=
(
SELECT COUNT(X.VALUE) FROM string_split(@InProducts,',')X
)
希望,你可以使用这样的东西
一个解决方案是先计算搜索中有多少个字,
然后 select 所有包含您的搜索的行,并使用计数仅保留具有相同组的行
这是一个例子
declare @Items table (id int, item_name varchar(50), code int, cust_id varchar(10))
insert into @Items values (1, 'Mango', 111, 'u1'),
(2, 'Milk', 112, 'u2'), (3, 'Chocolate', 113, 'u3'), (4, 'Milk', 112, 'u1'), (5, 'Mango', 111, 'u2'),
(6, 'Berry', 114, 'u3'), (7, 'Chocolate', 113, 'u1'), (8, 'Berry', 114, 'u2'), (9, 'Ice-cream', 114, 'u3'),
(10, 'Mango', 111, 'u4')
declare @search varchar(50) = 'Mango,Milk'
declare @cnt int = (select len(@search) - len(replace(@search, ',', '')) + 1)
select cust_id
from @Items
where @search like '%' + item_name + '%'
group by cust_id
having count(1) = @cnt
这将 return
cust_id
u1
u2
如果你想把它放在一个字符串中,你可以使用 string_agg
declare @search varchar(50) = 'Mango,milk'
declare @cnt int = (select len(@search) - len(replace(@search, ',', '')) + 1)
select 'cust_id = ' +
( select string_agg(t.cust_id, ', ')
from ( select top 100000
i.cust_id
from @Items i
where @search like '%' + i.item_name + '%'
group by i.cust_id
having count(1) = @cnt
) t
) as Result
这将 return
cust_id = u1, u2
项目Table:
id | item_name | code | cust_id |
---|---|---|---|
1 | Mango | 111 | u1 |
2 | Milk | 112 | u2 |
3 | Chocolate | 113 | u3 |
4 | Milk | 112 | u1 |
5 | Mango | 111 | u2 |
6 | Berry | 114 | u3 |
7 | Chocolate | 113 | u1 |
8 | Berry | 114 | u2 |
9 | Ice-cream | 114 | u3 |
10 | Mango | 111 | u4 |
这些是客户 table,我必须在 SQL 服务器中编写一个 存储过程 来找到已经购买的 cust_id所有项目都以逗号分隔值传递,例如 'Mango,Milk,Chocolate'
CREATE PROCEDURE Items_find
@items_value nvarchar(max)
AS
BEGIN
END
EXEC Items_find 'Mango,Milk,Chocolate'
EXEC Items_find 'Mango,Milk'
存储过程应该 return cust_id = u1
如果 'Mango,Milk'
那么输出应该是 cust_id=u1, u2
或者如果 'Mango'
那么输出是 cust_id=u1, u2, u3
我已经尝试过滤掉 cust_id
w.r.t。以逗号分隔传递的项目计数,但在那之后我找不到 cust_id
专门购买这些项目的人
DECLARE @InProducts VARCHAR(100);
--SET @InProducts='Mango,Milk,Chocolate';
SET @InProducts='Mango,Milk';
WITH CTE(id, item_name, code, cust_id) AS
(
SELECT 1,'MANGO',111,'U1'
UNION ALL
SELECT 2,'MILK',112,'U2'
UNION ALL
SELECT 3,'CHOCOLATE',113,'U3'
UNION ALL
SELECT 4,'MILK',112,'U1'
UNION ALL
SELECT 5,'MANGO',111,'U2'
UNION ALL
SELECT 6,'BERRY',114,'U3'
UNION ALL
SELECT 7,'CHOCOLATE',113,'U1'
UNION ALL
SELECT 8,'BERRY',114,'U2'
UNION ALL
SELECT 9,'ICE-CREAM',115,'U3'
UNION ALL
SELECT 10,'MANGO',111,'U4'
)
SELECT Z.CUST_ID FROM
(
SELECT C.*FROM CTE AS C
JOIN string_split(@InProducts,',')X ON C.item_name=X.value
)Z
GROUP BY Z.cust_id HAVING COUNT(Z.CUST_ID)=
(
SELECT COUNT(X.VALUE) FROM string_split(@InProducts,',')X
)
希望,你可以使用这样的东西
一个解决方案是先计算搜索中有多少个字,
然后 select 所有包含您的搜索的行,并使用计数仅保留具有相同组的行
这是一个例子
declare @Items table (id int, item_name varchar(50), code int, cust_id varchar(10))
insert into @Items values (1, 'Mango', 111, 'u1'),
(2, 'Milk', 112, 'u2'), (3, 'Chocolate', 113, 'u3'), (4, 'Milk', 112, 'u1'), (5, 'Mango', 111, 'u2'),
(6, 'Berry', 114, 'u3'), (7, 'Chocolate', 113, 'u1'), (8, 'Berry', 114, 'u2'), (9, 'Ice-cream', 114, 'u3'),
(10, 'Mango', 111, 'u4')
declare @search varchar(50) = 'Mango,Milk'
declare @cnt int = (select len(@search) - len(replace(@search, ',', '')) + 1)
select cust_id
from @Items
where @search like '%' + item_name + '%'
group by cust_id
having count(1) = @cnt
这将 return
cust_id
u1
u2
如果你想把它放在一个字符串中,你可以使用 string_agg
declare @search varchar(50) = 'Mango,milk'
declare @cnt int = (select len(@search) - len(replace(@search, ',', '')) + 1)
select 'cust_id = ' +
( select string_agg(t.cust_id, ', ')
from ( select top 100000
i.cust_id
from @Items i
where @search like '%' + i.item_name + '%'
group by i.cust_id
having count(1) = @cnt
) t
) as Result
这将 return
cust_id = u1, u2