SQL Server可以通过分隔符索引文本字符串吗?

时间:2013-12-10 12:52:01

标签: sql-server indexing

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

foo.bar.baz

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

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

foo

或者

foo.bar

是的,我可以做一个LIKE查询,但我从来不需要找到类似的东西:

fo

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

SQL是否有任何方法可以索引由点分隔的字符串的所有排列?所以,在上面的例子中我们有:

foo
foo.bar
foo.bar.baz

是否有任何类型的索引可以方便搜索?

修改

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

foo.bar

从不:

bar.baz

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

它似乎是CTE的作品!

create TableA(
id int identity,
parentid int null,
name varchar(50)
)

对于(固定)两级易于<​​/ p>

select t2.name, t1.name
from tableA t1
join tableA t2 on t2.id = t1.parentid
where t2.name = 'father'

要为最常见的情况找到那种层次结构值,您需要使用CTE在自联接表中进行某种递归。

http://msdn.microsoft.com/pt-br/library/ms175972.aspx