在查找子串时,也要查找结束位置

Joh*_*ohn 5 sql-server collation substring

子句LIKE可以测试某个字符串是否出现在另一个字符串中,并且该CHARINDEX函数可以给出第一个匹配的开始位置。

\n

就我而言,我对结束位置感兴趣,由于排序规则的复杂性,它无法从开始位置推导出来。例如,在德语排序规则 ( German_PhoneBook_100_CI_AS_SC_UTF8) 中,

\n
    \n
  • h\xc3\xa4出现在 'H\xc3\xa4ger' 的位置 1 处,结束于位置 2 处
  • \n
  • h\xc3\xa4出现在“Haeger”中的位置 1 并结束于位置 3。
  • \n
\n

这样做的问题是为了用户的利益标记搜索结果文本的匹配部分。

\n

我一直在考虑反转字符串,但我仍然只能得到第一个匹配项CHARINDEX,在反转的情况下我需要最后一个匹配项。

\n

有人有什么想法吗?

\n

Joh*_*ohn 1

以下是一个新的尝试,我相信它是有效的,但比这个答案中发布的第一个尝试要黑客得多。

\n

基于使用的想法replace,但必须处理replace替换所有而不仅仅是第一次出现的事实,我现在将匹配项替换为包含可识别分隔符的内容,我可以使用该分隔符找到它charindex分隔其余部分。然后我可以删除其余部分并查看其余部分的长度。

\n

然而,让我们做出以下假设,让我们的生活变得更轻松一些,即使有这些限制,它也会变得足够复杂:

\n
    \n
  1. 假设搜索字符串位于要搜索的源的开头。这是我的问题实际需要的情况,但也可能存在更通用的解决方案。
  2. \n
  3. 分隔符不在源代码中。就我自己而言,我可以选择一个外来字符,并接受此功能不适用于实际出现的一个罕见字符串。(当然我先检查一下。)
  4. \n
  5. 为了不必在查询中到处指定排序规则,我假设查询在排序规则为 German_PhoneBook_100_CI_AS_SC_UTF8 的数据库中运行 - 确保在运行时执行相同的操作或添加排序规则说明符。
  6. \n
\n

首先,这是一个编程版本:

\n
declare @sep char(1) = \'|\'\ndeclare @source varchar(60) = \'haegerhae\'\ndeclare @tofind varchar(60) = \'h\xc3\xa4\'\n\ndeclare @helper varchar(61) = concat(@tofind, @sep)\n\ndeclare @temp varchar(60) = replace(@source, @tofind, @helper)\ndeclare @l int = charindex(@sep, @temp, 1)\n\nselect @temp temp, left(@source, @l) [match];\n
Run Code Online (Sandbox Code Playgroud)\n

余数显示为hae,它还通过长度告诉我们结束位置。

\n

这是内联表达式:

\n
select left(@source, charindex(@sep, replace(@source, @tofind, concat(@tofind, @sep)), 1)) [match]\n
Run Code Online (Sandbox Code Playgroud)\n