C# 如何在不考虑序列的情况下将字符串分隔的字符串与sql中的列值进行比较
如何在不考虑序列的情况下将字符串分隔的字符串与sql中的列值进行比较C# 如何在不考虑序列的情况下将字符串分隔的字符串与sql中的列值进行比较,c#,asp.net,.net,sql-server,C#,Asp.net,.net,Sql Server,如何在不考虑序列的情况下将字符串分隔的字符串与sql中的列值进行比较 假设我在sql列[fruits]中有一个值——芒果、苹果、樱桃。。。我在asp.net C中列出了樱桃、芒果、苹果。。。我想编写sql查询,这样它就可以无顺序地匹配sql表。我建议您看看这个问题的精彩答案 也就是说,您的解决方案应该是将每个包含单词的列传递给此函数,然后将其与列ID一起存储在表中 所以“芒果、苹果、樱桃”成了一张有价值的桌子 ColdID Value _______________ 1 mang
假设我在sql列[fruits]中有一个值——芒果、苹果、樱桃。。。我在asp.net C中列出了樱桃、芒果、苹果。。。我想编写sql查询,这样它就可以无顺序地匹配sql表。我建议您看看这个问题的精彩答案 也就是说,您的解决方案应该是将每个包含单词的列传递给此函数,然后将其与列ID一起存储在表中 所以“芒果、苹果、樱桃”成了一张有价值的桌子
ColdID Value
_______________
1 mango
1 apple
1 cherry
现在,按ColID ASC、Value ASC对表进行排序,并比较两个表。这样就可以了
DECLARE @str NVARCHAR(MAX)
, @Delim NVARCHAR(255)
SELECT @str = 'cherry,mango,peach,apple'
SELECT @Delim = ','
CREATE TABLE #Fruits ( Fruit VARCHAR(255) )
INSERT INTO #Fruits
( Fruit )
VALUES ( 'cherry' ),
( 'Mango' ),
( 'Apple' ) ,
( 'Banana' )
;WITH lv0 AS (SELECT 0 g UNION ALL SELECT 0)
,lv1 AS (SELECT 0 g FROM lv0 a CROSS JOIN lv0 b) -- 4
,lv2 AS (SELECT 0 g FROM lv1 a CROSS JOIN lv1 b) -- 16
,lv3 AS (SELECT 0 g FROM lv2 a CROSS JOIN lv2 b) -- 256
,lv4 AS (SELECT 0 g FROM lv3 a CROSS JOIN lv3 b) -- 65,536
,lv5 AS (SELECT 0 g FROM lv4 a CROSS JOIN lv4 b) -- 4,294,967,296
,Tally_CTE (n) AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM lv5)
SELECT SUBSTRING(@str, N, CHARINDEX(@Delim, @str + @Delim, N) - N) AS Item
INTO #StrTable
FROM Tally_CTE
WHERE N BETWEEN 1 AND DATALENGTH(@str) + DATALENGTH(@Delim)
AND SUBSTRING(@Delim + @str, N, LEN(@Delim)) = @Delim;
--#############################################################################
-- in both
--#############################################################################
SELECT *
FROM #Fruits F
JOIN #StrTable ST ON F.Fruit = ST.Item
--#############################################################################
-- in table but not string
--#############################################################################
SELECT *
FROM #Fruits F
LEFT JOIN #StrTable ST ON ST.Item = F.Fruit
WHERE ST.Item IS NULL
--#############################################################################
-- in string but not table
--#############################################################################
SELECT *
FROM #StrTable ST
LEFT JOIN #Fruits F ON ST.Item = F.Fruit
WHERE F.Fruit IS NULL
GO
DROP TABLE #Fruits
DROP TABLE #StrTable
您可以使用string_split函数来执行此操作。我在SQL Server 2017 ctp 2.0上对此进行了测试,但在2016年也应该可以使用
drop table if exists dbo.Fruits;
create table dbo.Fruits (
Fruits varchar(100)
);
insert into dbo.Fruits (Fruits)
values ('cherry,mango,apple'), ('peanut,cherry,mango'),
('apple,cherry,mango')
declare @str varchar(100) = 'apple,mango,cherry';
select
tt.Fruits
, COUNT(tt.value) as Value01
, COUNT(app.value) as Value02
from (
select
*
from dbo.Fruits f
outer apply string_split (f.Fruits, ',') t
) tt
left join string_split (@str, ',') app on tt.value = app.value
group by tt.Fruits
想一想,如果你有3行
a
、b
和c
,而不是1行a、b、c
,这将是多么容易。使用逗号分隔的值几乎毫无例外是一个糟糕的设计选择。我有水果列..并且我必须以逗号分隔的形式存储..出于我的要求请帮助ppppppppp哪个版本的sql server?2014是版本请不要在发布的链接中使用接受的答案。答案是使用循环分割字符串,这是非常低效的。到目前为止,最好的方法是不存储分隔的数据,但如果您确实在此处签出拆分选项。许多选项是基于集合的,不使用循环。