查询列以查看它是否包含特定数字的最佳方法是什么?该列是varchar

Mad*_*r24 1 sql linq sql-server linq-to-sql

我有一个包含一列的表,其中包含一些用逗号分隔的数字.我需要选择包含特定值的*行.我正在使用SQL Server和C#,因此它可以在SQL或LINQ中.

我的频道列(varchar)中的数据如下所示:1,5,8,22,27,33

我的媒体表如下所示:

MediaID MediaName MediaDate ChannelIDs
------- --------- --------- ----------
1 | The Cow Jumped Over The Moon | 01/18/2015 | 1,5,8,22,27,33
2 | The Cat In The Hat | 01/18/2015 | 2,4,9,25,28,31
3 | Robin Hood The Thief | 01/18/2015 | 3,5,6,9,22,33
4 | Jingle Bells Batman Smells | 01/18/2015 | 6,7,9,24,25,32
5 | Up The River Down The River | 01/18/2015 | 5,6,10,25,26,33
Run Code Online (Sandbox Code Playgroud)

等等...

我的频道表如下所示:

ChannelID ChannelName
--------- -----------
1 Animals
2 Television
3 Movies
4 Nursery Rhymes
5 Holidays
Run Code Online (Sandbox Code Playgroud)

等等...

每行媒体可以包含多个频道.

我应该使用像这样的包含搜索吗?

SELECT * FROM Media WHERE CONTAINS (Channels,'22')
Run Code Online (Sandbox Code Playgroud)

这需要我对该列进行全文索引,但我真的不想在我的全文索引中包含此列.

有一个更好的方法吗?

谢谢

Gor*_*off 6

您应该修复数据格式,这样就不会将数字存储为逗号分隔的字符串.SQL为列表提供了很好的数据结构,它被称为表而不是字符串.特别是,您需要一个每个"media"实体和id一行的联结表.

也就是说,有时您会遇到特定的数据结构.如果是这样,您可以使用:

where ','+channels+',' like '%,22,%'
Run Code Online (Sandbox Code Playgroud)

注意:这不能利用常规索引,因此性能不会很好.如果您有一个大表并且需要更好的性能,请修复数据结构.