我需要存储由字符串键入的内容,因此基本上是键/值对的数据库表。但是,密钥将采用分层格式,如下所示:
foo.bar.baz
他们将有多个类别,由点分隔。上述值位于名为“baz”的类别中,该类别位于名为“bar”的父类别中,该类别位于名为“foo”的父类别中。
如何以这样一种方式对其进行索引,使其可以快速搜索到键/点组合的不同排列?例如,我希望能够非常快速地找到所有开始的内容
foo
或者
foo.bar
是的,我可以做一个LIKE查询,但我从来不需要找到类似的东西:
fo
这对我来说似乎是一种浪费。
SQL是否有任何方法可以索引由点分隔的字符串的所有排列?所以,在上面的例子中我们有:
foo
foo.bar
foo.bar.baz
是否有任何类型的索引可以方便搜索?
修改
我永远不需要向后搜索或从中间搜索。我的搜索总是从字符串的前面开始:
foo.bar
从不:
bar.baz
答案 0 :(得分:4)
SQL Server无法真正索引子字符串,没有。如果你只想搜索第一个字符串,这将工作正常,并将执行索引查找(当然取决于其他查询语义):
WHERE col LIKE 'foo.%';
-- or
WHERE col LIKE 'foo.bar.%';
但是当您开始需要在任何前导字符串后面搜索bar
或baz
时,您需要搜索子字符串:
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在自联接表中进行某种递归。