根据传递的逗号分隔值获取客户 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