我正在使用SQL Server 2008.我正在尝试返回所有记录,其中给定列的子字符串与一组非常大的令牌中的至少一个令牌匹配。我正在搜索的列数也很大。做这个的最好方式是什么?
我知道基本方法是这样的:
WHERE
(col1 LIKE '%token1%' OR col1 LIKE '%token2%' OR...
OR
col2 LIKE '%token1%' OR col1 LIKE '%token2%' OR...
OR
. . . .
)
然而,这将是非常乏味和大。
答案 0 :(得分:2)
评论时间有点长。
你基本上有两种选择。首先是全文搜索。也就是说,将每列视为文档并在其上创建全文索引。
第二个选项是规范化您的数据结构。您将为每列中的每个标记创建一个单独的行。此规范化结构中的一行如下所示:
EntityId "Column" Token
1 col1 Toke1
1 col3 Toke2
2 col1 Toke2
. . .
此结构可以使用适当的索引大大加快搜索速度。
顺便说一句,您的数据结构看起来很可疑。包含列中事物列表的表通常是个坏主意。关系数据库中列表的正确数据结构是表,而不是列。包含多个列的表包含相同类型的信息(例如标记列表)通常表明列应该非规范化。