SQL 服务器的逗号分隔输入字符串
Comma-separated input string for SQL Server
您好SQL服务器专家。请帮助我以有效的方式将布尔逻辑(和,或)应用于 SQLsServer 中以逗号分隔的输入字符串。
示例:
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。在上面 table 中,结果将是 ID 为 1 的数据。因此结果将是
ID | Values
-----------
1 | A,B,C
if @andOr = 'or'
,我想获取值为 A 或 B 的 ID。在上面的 table 中,结果将是 ID 为 1,3 和 4 的数据。所以结果将是
ID | Values
-----------
1 | A,B,C
3 | A
4 | B
谢谢。
请测试以下 SQL Select 语句
首先要注意的是SQL string split function
您可以在数据库上创建用户定义的拆分函数的副本
我使用 COUNT() aggregate function with Partition By 子句。这对于程序员来说也是T-SQL的一大提升。我用它来检查所有输入参数字符串片段是否与@ATable 值匹配
最后一招是string concatenation in SQL展示。我使用 "For XML Path" 进行字符串连接以满足您的要求
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
结果是
您好SQL服务器专家。请帮助我以有效的方式将布尔逻辑(和,或)应用于 SQLsServer 中以逗号分隔的输入字符串。
示例:
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。在上面 table 中,结果将是 ID 为 1 的数据。因此结果将是
ID | Values
-----------
1 | A,B,C
if @andOr = 'or'
,我想获取值为 A 或 B 的 ID。在上面的 table 中,结果将是 ID 为 1,3 和 4 的数据。所以结果将是
ID | Values
-----------
1 | A,B,C
3 | A
4 | B
谢谢。
请测试以下 SQL Select 语句
首先要注意的是SQL string split function 您可以在数据库上创建用户定义的拆分函数的副本
我使用 COUNT() aggregate function with Partition By 子句。这对于程序员来说也是T-SQL的一大提升。我用它来检查所有输入参数字符串片段是否与@ATable 值匹配
最后一招是string concatenation in SQL展示。我使用 "For XML Path" 进行字符串连接以满足您的要求
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
结果是