AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 316647
Accepted
John
John
Asked: 2022-09-09 07:54:54 +0800 CST2022-09-09 07:54:54 +0800 CST 2022-09-09 07:54:54 +0800 CST

在找到一个子字符串时,也要找到结束位置

  • 772

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

就我而言,我对结束位置感兴趣,因为排序规则的复杂性,不能从开始位置推导出来。例如,在德语归类 ( German_PhoneBook_100_CI_AS_SC_UTF8) 中,

  • hä出现在位置 1 的“Häger”中并在位置 2 处结束,并且
  • hä出现在位置 1 的 'Haeger' 中,并在位置 3 结束。

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

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

有什么想法吗?

sql-server collation
  • 2 2 个回答
  • 98 Views

2 个回答

  • Voted
  1. Best Answer
    John
    2022-09-09T08:31:21+08:002022-09-09T08:31:21+08:00

    以下是我认为可行的新尝试,但比此答案中发布的第一个尝试要复杂得多。

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

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

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

    首先,这是一个程序化版本:

    declare @sep char(1) = '|'
    declare @source varchar(60) = 'haegerhae'
    declare @tofind varchar(60) = 'hä'
    
    declare @helper varchar(61) = concat(@tofind, @sep)
    
    declare @temp varchar(60) = replace(@source, @tofind, @helper)
    declare @l int = charindex(@sep, @temp, 1)
    
    select @temp temp, left(@source, @l) [match];
    

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

    这是内联表达式:

    select left(@source, charindex(@sep, replace(@source, @tofind, concat(@tofind, @sep)), 1)) [match]
    
    • 1
  2. Michael Green
    2022-09-10T14:53:31+08:002022-09-10T14:53:31+08:00

    CHARINDEX 将给出比赛的飞镖。使用 STUFF 插入 @sep。这将打破比赛。一次前进一个位置,直到比赛恢复。这将结束源。

    haeger   match at position 1   
    h|aeger  no match    
    ha|eger  no match    
    hae|ger  match    
    

    因此,比赛从位置 1 延伸到 3(含)。

    如果原始字符串中有多个匹配项,这将在第一次填充 @sep 后显示。在这种情况下,可以从那里截断原件并以这种方式进行搜索。

    抱歉,我目前无法清楚地输入此内容。明天吧。希望它仍然有用。

    • 1

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve