用于SQL Server的逗号分隔输入字符串

用于SQL Server的逗号分隔输入字符串

问题描述:

Hello SQL Server专家。请帮助我以高效的方式将布尔逻辑(和,或)应用于SQLsServer中以逗号分隔的输入字符串。用于SQL Server的逗号分隔输入字符串

实施例:

DECLARE @ATable TABLE(ID INT, Value varchar(50)) 

INSERT INTO @ATable 
VALUES (1, 'A'), (1, 'B'), (1, 'C'), (2, 'C'), (2, 'D'), (3, 'A'), (4, 'B') 

declare @inputStr varchar(max) 
set @inputStr = 'A,B,C,D' 

declare @andOr varchar(30) -- can be either 'and' or 'or' 

if @andOr = 'and',我想获得具有值的A和B二者,在上述表中的结果将是与ID 1的数据ID,这样的结果将是

ID | Values 
----------- 
1 | A,B,C 

if @andOr = 'or',我想获得具有值的A或B在上述表中的结果将是与编号1,3和4的数据ID,这样的结果将是

ID | Values 
----------- 
1 | A,B,C 
3 | A 
4 | B 

谢谢。

+0

我已经使用动态SQL尝试,但它变得很慢时 – WorkInProgress

+4

您需要输入字符串的长度增加将字符串拆分成单独的行以便能够最好地处理任何类型的查询。更好的是 - 首先有一个表值参数而不是字符串! – Bridge

+0

对于AND情况,您需要执行Bridge建议的操作。 IN子句通常适用于你的OR案例。 –

请测试下面的SQL Select语句

你要注意的是SQL string split function 可以将数据库

上创建用户定义分裂功能的副本我使用COUNT() aggregate function with Partition By条款的第一件事。对于程序员来说,这也是T-SQL的一大提升。我用它来检查所有输入参数字符串段是否与@atable值匹配

最后一个技巧是string concatenation in SQL用于显示。我用“对于XML路径”字符串连接,以满足您的要求

DECLARE @ATable TABLE(ID INT, Value varchar(50)) 
INSERT INTO @ATable VALUES (1,'A'),(1,'B'),(1,'C'),(2,'C'),(2,'D'),(3,'A'),(4,'B') 

declare @inputStr varchar(max) 
set @inputStr='A,B' 
declare @andOr varchar(30) 

set @andOr='and' 

SELECT 
    t.ID, 
    STUFF(
    (
     SELECT ',' + t1.Value 
     FROM @ATable t1 
     WHERE t1.ID = t.ID 
     FOR XML PATH(''),TYPE 
    ).value('.','VARCHAR(MAX)' 
    ), 1, 1, '') as [Values] 
FROM (
    select 
     distinct ID 
    from (
    select 
     s.cnt, t.*, 
     tcount = count(t.value) over (partition by t.id) 
    from (
     select *, cnt = count(*) over (partition by 1) from dbo.split(@inputStr,',') s 
    ) s 
    left join @ATable t on s.val = t.value 
    ) r 
    where tcount = cnt 
) t 

set @andOr='or' 

SELECT 
    t.ID, 
    STUFF(
    (
     SELECT ',' + t1.Value 
     FROM @ATable t1 
     WHERE t1.ID = t.ID 
     FOR XML PATH(''),TYPE 
    ).value('.','VARCHAR(MAX)' 
    ), 1, 1, '') as [Values] 
FROM (
    select 
     distinct t.ID 
    from dbo.split(@inputStr,',') s 
    inner join @ATable t on s.val = t.value 
) t 

结果是 enter image description here