相似匹配与比较之间的关系

Joh*_*ohn 7 sql-server collation order-by

like \'foo%\'我天真地认为 a和 a之间的关系>= \'foo\'是后者与前者以及索引顺序中后面的一些附加行相匹配。更一般地说,我认为对于给定的文本,t字符列上的索引分为四个区域,分别是

\n
    \n
  1. <( )之前的条目t
  2. \n
  3. 条目等于 ( =) t
  4. \n
  5. >大于 ( )t且仍以t( ) 作为前缀的条目like concat(t, \'%\')以及
  6. \n
  7. 其余的部分,
  8. \n
\n

并且这些区域是连续的并且按顺序排列。

\n

此外,具有t前缀 ( like concat(t, \'%\')) 的所有行也在索引中形成一个连续区域,并且该区域在其开头包含区域 2(这意味着它恰好是区域 2 和 3 在一起)。

\n

但事情可能没那么简单。例如,在 SQL Server 中,单词在排序规则中H\xc3\xa4user比较等于,并且两者都是。HaeuserGerman_PhoneBook_CI_AI>= \'Ha\'

\n

但是,仅Haeuser匹配like \'Ha%\',因此有关前缀的附加假设并不完全成立。

\n

你可以在这个小提琴中看到这一点。

\n

我的问题是这里还有哪些其他假设可能是错误的。锚定 like 的结果是否总是给出索引的连续切片还是可能存在间隙?1我至少还有那四个连续的区域吗?

\n

我正在解决的根本问题是一个通用数据库 UI,它显示给定搜索词的索引切片。从用户体验的角度来看,不让用户选择是否要进行前缀、相等或大于搜索,而是简单地从相等开始(在升序搜索的情况下),这是有益的,如下索引,然后标记两个进一步的边界“从这里开始不再相等”和“这里甚至不再是前缀”。

\n

只有字符类型存在此问题,因为它来自排序规则的复杂性。

\n

这个问题被标记为 SQL Server,但我觉得如果存在 RDMS,这不是真的,这可能是我需要了解的更深层次的问题 - 所以请随意评论任何不同意的引擎我的假设。

\n
\n

1意思是,是否可以有值rsr < t < swherers两者都与锚定的类似但t不匹配?

\n

Dav*_*oft 7

\n

例如,在 SQL Server 中,单词 H\xc3\xa4user 在排序规则 German_PhoneBook_CI_AI 中位于 Haeuser 之前

\n
\n

不,没有。他们是平等的。

\n
  select case when  N\'H\xc3\xa4user\' < N\'Haeuser\' Collate German_PhoneBook_CI_AI \n              then \'true\' else \'false\' end\n
Run Code Online (Sandbox Code Playgroud)\n

回报

\n

错误的

\n
N\'H\xc3\xa4\' = N\'Hae\' Collate German_PhoneBook_CI_AI \n
Run Code Online (Sandbox Code Playgroud)\n

\n
 N\'Ha\' < N\'H\xc3\xa4\'  Collate German_PhoneBook_CI_AI \n
Run Code Online (Sandbox Code Playgroud)\n

所以N\'H\xc3\xa4user\'不是like \'Ha%\'但是是like N\'Hae%\'并且like N\'H\xc3\xa4%\'

\n

SQL Server 可能无法like在索引查找+有序扫描中完全评估谓词,而必须查找+扫描更大的范围并将like运算符应用于更大范围中的行。看动态查找和隐藏的隐式转换

\n

  • @John,但正是由于`N'Hä' = N'Hae'`,我们可以构造交替的有序序列,如`N'Hä' &lt; N'Haeb' &lt; N'Häc' &lt; N'Haed' &lt; N 'Häm' &lt; N'Haeu'`...这不是你最后一段 (r&lt;t&lt;s) 所问的吗? (2认同)