如何在不考虑序列的情况下将字符串分隔的字符串与sql中的列值进行比较

时间:2017-05-17 12:23:32

标签: c# asp.net .net sql-server

如何在不考虑序列的情况下将字符串分隔的字符串与sql中的列值进行比较?

假设我在sql列中有一个值[fruits] - 芒果,苹果,樱桃......我在asp.net中列出了C#cherry,mango,apple ...我想写一个sql查询这样它可以匹配没有订单的sql表。

3 个答案:

答案 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