Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server能否按分隔符为文本字符串编制索引?_Sql Server_Indexing - Fatal编程技术网

Sql server SQL Server能否按分隔符为文本字符串编制索引?

Sql server SQL Server能否按分隔符为文本字符串编制索引?,sql-server,indexing,Sql Server,Indexing,我需要存储由字符串键控的内容,因此基本上是一个由键/值对组成的数据库表。但是,密钥将采用分层格式,如下所示: foo.bar.baz 它们将有多个类别,由点分隔。上述值位于名为“baz”的类别中,该类别位于名为“bar”的父类别中,该父类别位于名为“foo”的父类别中 我如何索引它,使它能够快速搜索不同排列的键/点组合?例如,我希望能够非常快速地找到开始的所有内容 foo 或 是的,我可以做一个类似的查询,但我永远不需要找到以下内容: fo 所以这对我来说是一种浪费 SQL有没有办法索引由

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

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

我如何索引它,使它能够快速搜索不同排列的键/点组合?例如,我希望能够非常快速地找到开始的所有内容

foo

是的,我可以做一个类似的查询,但我永远不需要找到以下内容:

fo
所以这对我来说是一种浪费

SQL有没有办法索引由点分隔的字符串的所有排列?因此,在上述情况下,我们有:

foo
foo.bar
foo.bar.baz
有没有任何类型的索引可以像这样方便搜索

编辑

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

foo.bar
从不:

bar.baz

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

但是,当您开始需要在任何前导字符串之后搜索
bar
baz
时,您需要在子字符串上搜索:

WHERE col LIKE '%.bar.%';
-- or
WHERE PATINDEX('%.bar.%', col) > 0;
这对常规的B树索引不起作用,而且我认为也没有多大帮助,因为有特殊的字符(句点)——但是如果这是一个要求,您应该尝试一下


一般来说,以这种方式存储数据对我来说是不对的。在我看来,您应该有单独的列,而不是将所有数据塞进一列,或者。

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

但是,当您开始需要在任何前导字符串之后搜索
bar
baz
时,您需要在子字符串上搜索:

WHERE col LIKE '%.bar.%';
-- or
WHERE PATINDEX('%.bar.%', col) > 0;
这对常规的B树索引不起作用,而且我认为也没有多大帮助,因为有特殊的字符(句点)——但是如果这是一个要求,您应该尝试一下


一般来说,以这种方式存储数据对我来说是不对的。在我看来,您应该有单独的列,而不是将所有数据塞进一列,或者。

这似乎是CTE的工作

create TableA(
id int identity,
parentid int null,
name varchar(50)
)
对于一个(固定的)两级的

select t2.name, t1.name
from tableA t1
join tableA t2 on t2.id = t1.parentid
where t2.name = 'father'
要在最一般的情况下找到这种层次化的值,需要使用CTE在自联接表中进行某种递归


它似乎是CTE的作品

create TableA(
id int identity,
parentid int null,
name varchar(50)
)
对于一个(固定的)两级的

select t2.name, t1.name
from tableA t1
join tableA t2 on t2.id = t1.parentid
where t2.name = 'father'
要在最一般的情况下找到这种层次化的值,需要使用CTE在自联接表中进行某种递归


我认为您没有注意到这三条数据是作为单个字符串存储在单个列中的,例如
column='foo.bar.baz'
。它们不是通过类似于
parentid
的东西来自动链接的,它们是扁平的。这充其量只是尴尬。无论如何,这篇文章听起来有点奇怪。没有SQL可以通过分隔点进行索引。关系数据库擅长处理关系实体,而不是解析基于字符串的逻辑。OP可以用这种方式提取数据吗?我想您没有注意到这三段数据是作为单个字符串存储在单个列中的,例如
column='foo.bar.baz'
。它们不是通过类似于
parentid
的东西来自动链接的,它们是扁平的。这充其量只是尴尬。无论如何,这篇文章听起来有点奇怪。没有SQL可以通过分隔点进行索引。关系数据库擅长处理关系实体,而不是解析基于字符串的逻辑。OP能用这种方式提取数据吗?我编辑并澄清了——除了字符串的前面,我永远不会从任何地方搜索。至于这是错的,我同意。这里的反规范化程度并不理想,但我无法控制。我正在处理我得到的东西。我按照我解释的格式加载了一个包含1000000行的表。LIKE从一开始('something%')的查询时间为450毫秒。如果我在开始处添加了一个通配符(“%something%”),查询时间将翻倍到大约850ms。显然,从一开始搜索时,某些索引起作用。考虑到我只会从一开始就搜索,这不是一个糟糕的性能。是的,就像我说的,如果你从一开始就搜索,你可能会得到一个索引搜索。我编辑并澄清了——除了字符串的前面,我永远不会从任何地方搜索。至于这是错的,我同意。这里的反规范化程度并不理想,但我无法控制。我正在处理我得到的东西。我按照我解释的格式加载了一个包含1000000行的表。LIKE从一开始('something%')的查询时间为450毫秒。如果我在开始处添加了一个通配符(“%something%”),查询时间将翻倍到大约850ms。显然,从一开始搜索时,某些索引起作用。考虑到我只会从一开始就搜索,这不是一个糟糕的性能。是的,就像我说的,如果你从一开始就搜索,你可能会得到一个索引搜索。