sql-server - SQL Server 可以通过分隔符对文本字符串进行索引吗?

标签 sql-server indexing

我需要存储由字符串键入的内容,因此本质上是一个键/值对的数据库表。但是,键将采用分层格式,如下所示:

foo.bar.baz

它们将有多个类别,由点分隔。上面的值位于名为“baz”的类别中,该类别位于名为“bar”的父类别中,而“bar”又位于名为“foo”的父类别中。

如何对其进行索引,以便可以快速搜索键/点组合的不同排列?例如,我希望能够非常快速地找到所有开头的内容

foo

或者

foo.bar

是的,我可以执行 LIKE 查询,但我永远不需要找到类似的内容:

fo

所以这对我来说似乎是一种浪费。

有什么方法可以让 SQL 索引由点分隔的字符串的所有排列吗?因此,在上述情况下我们有:

foo
foo.bar
foo.bar.baz

是否有任何类型的索引可以促进这样的搜索?

编辑

我永远不需要向后或从中间搜索。我的搜索总是从字符串的前面开始:

foo.bar

从不:

bar.baz

最佳答案

SQL Server 无法真正索引子字符串,不是。如果您只想搜索第一个字符串,这将工作得很好,并且将执行索引查找(当然取决于其他查询语义):

WHERE col LIKE 'foo.%';
-- or
WHERE col LIKE 'foo.bar.%';

但是,当您开始需要搜索任何前导字符串后的 barbaz 时,您将需要搜索子字符串:

WHERE col LIKE '%.bar.%';
-- or
WHERE PATINDEX('%.bar.%', col) > 0;

这不适用于常规 B 树索引,我不这么认为 Full-Text Search由于特殊字符(句点),也会有很大帮助 - 但如果这是一个要求,您应该尝试一下。

总的来说,以这种方式存储数据对我来说是错误的。在我看来,你应该要么有单独的列,而不是将所有数据塞到一列中,要么 using a more relational EAV design .

关于sql-server - SQL Server 可以通过分隔符对文本字符串进行索引吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20495102/

相关文章:

sql-server - 无法通过 SSIS 连接到 Excel

当索引大于数组长度时,Javascript 循环回到数组开头

sql-server - 当我为列编制索引时,为什么我的 View 变慢了?

c - 另一个计数器给一个计数器赋值,防止计数器递增?

sql - 一天中的所有时间

javascript - 语法错误 : Unexpected token * after importing sequelize model db object

sql-server - 从 LINQ to SQL 查询时间戳列

python - 如何在 python 中填充 pandas 数据框列中的剩余数值并作为索引?

sql - 索引如何减慢 select 语句的速度?

sql - 将 nvarchar 转换为十进制时,将 nvarchar 转换为数据类型 numeric 时出现算术溢出错误