Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在不考虑序列的情况下将字符串分隔的字符串与sql中的列值进行比较_C#_Asp.net_.net_Sql Server - Fatal编程技术网

C# 如何在不考虑序列的情况下将字符串分隔的字符串与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中的列值进行比较


假设我在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是版本请不要在发布的链接中使用接受的答案。答案是使用循环分割字符串,这是非常低效的。到目前为止,最好的方法是不存储分隔的数据,但如果您确实在此处签出拆分选项。许多选项是基于集合的,不使用循环。