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



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

假设我在 sql 列 [水果] 中有一个值 - 芒果、苹果、樱桃...我在 C# asp.net 中列出了樱桃、芒果、苹果...我想编写 sql 查询,以便它可以在没有顺序的情况下匹配 sql 表。

我建议你看看这个SO问题中的精彩答案

如何将逗号分隔的值拆分为列

也就是说,您的解决方案应该是将包含单词的每一列传递给此函数,然后将其与列 ID 一起存储在表中。

所以"芒果,苹果,樱桃"变成了一个有价值的表格

ColdID   Value
_______________
1      mango
1      apple
1      cherry

现在按 ColID ASC、值 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

最新更新