Joh*_*ohn 7 sql-server collation order-by
like \'foo%\'我天真地认为 a和 a之间的关系>= \'foo\'是后者与前者以及索引顺序中后面的一些附加行相匹配。更一般地说,我认为对于给定的文本,t字符列上的索引分为四个区域,分别是
<( )之前的条目t,=) t,>大于 ( )t且仍以t( ) 作为前缀的条目like concat(t, \'%\')以及并且这些区域是连续的并且按顺序排列。
\n此外,具有t前缀 ( like concat(t, \'%\')) 的所有行也在索引中形成一个连续区域,并且该区域在其开头包含区域 2(这意味着它恰好是区域 2 和 3 在一起)。
但事情可能没那么简单。例如,在 SQL Server 中,单词在排序规则中H\xc3\xa4user比较等于,并且两者都是。HaeuserGerman_PhoneBook_CI_AI>= \'Ha\'
但是,仅Haeuser匹配like \'Ha%\',因此有关前缀的附加假设并不完全成立。
你可以在这个小提琴中看到这一点。
\n我的问题是这里还有哪些其他假设可能是错误的。锚定 like 的结果是否总是给出索引的连续切片还是可能存在间隙?1我至少还有那四个连续的区域吗?
\n我正在解决的根本问题是一个通用数据库 UI,它显示给定搜索词的索引切片。从用户体验的角度来看,不让用户选择是否要进行前缀、相等或大于搜索,而是简单地从相等开始(在升序搜索的情况下),这是有益的,如下索引,然后标记两个进一步的边界“从这里开始不再相等”和“这里甚至不再是前缀”。
\n只有字符类型存在此问题,因为它来自排序规则的复杂性。
\n这个问题被标记为 SQL Server,但我觉得如果存在 RDMS,这不是真的,这可能是我需要了解的更深层次的问题 - 所以请随意评论任何不同意的引擎我的假设。
\n1意思是,是否可以有值r和s与r < t < swherer和s两者都与锚定的类似但t不匹配?
\n\n例如,在 SQL Server 中,单词 H\xc3\xa4user 在排序规则 German_PhoneBook_CI_AI 中位于 Haeuser 之前
\n
不,没有。他们是平等的。
\n select case when N\'H\xc3\xa4user\' < N\'Haeuser\' Collate German_PhoneBook_CI_AI \n then \'true\' else \'false\' end\nRun Code Online (Sandbox Code Playgroud)\n回报
\n错误的
\nN\'H\xc3\xa4\' = N\'Hae\' Collate German_PhoneBook_CI_AI \nRun Code Online (Sandbox Code Playgroud)\n但
\n N\'Ha\' < N\'H\xc3\xa4\' Collate German_PhoneBook_CI_AI \nRun Code Online (Sandbox Code Playgroud)\n所以N\'H\xc3\xa4user\'不是like \'Ha%\'但是是like N\'Hae%\'并且like N\'H\xc3\xa4%\'。
SQL Server 可能无法like在索引查找+有序扫描中完全评估谓词,而必须查找+扫描更大的范围并将like运算符应用于更大范围中的行。看动态查找和隐藏的隐式转换