如何在不考虑序列的情况下将字符串分隔的字符串与sql中的列值进行比较?
假设我在sql列中有一个值[fruits] - 芒果,苹果,樱桃......我在asp.net中列出了C#cherry,mango,apple ...我想写一个sql查询这样它可以匹配没有订单的sql表。
答案 0 :(得分:0)
我建议你看看这个SO问题中的神话般的答案
<强> How to split a comma-separated value to columns 强>
也就是说,您的解决方案应该将包含单词的每个列传递给此函数,然后将其与列ID一起存储在表中。
所以“芒果,苹果,樱桃”变成了一个有价值的桌子
ColdID Value
_______________
1 mango
1 apple
1 cherry
现在按照ColID ASC,Value ASC对表进行排序,并比较两个表。
答案 1 :(得分:0)
这应该这样做。
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
答案 2 :(得分:0)
您可以使用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