You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在单条SQL查询中通过CHARINDEX函数获取多个字符的位置?

在单条SQL查询中用CHARINDEX获取多个字符位置的方法

当然可以!你完全能在单条SQL查询里通过CHARINDEX函数获取目标字符的多个出现位置,不用像示例里那样分开写多个SELECT语句。下面结合你的示例数据,给你两种实用的实现方式:

方法一:嵌套调用CHARINDEX(适合已知目标字符出现次数的场景)

如果已经知道要找的字符大概出现几次,可以直接在同一个SELECT语句里嵌套调用CHARINDEX,每次把上一次找到的位置+1作为新的起始搜索点,就能依次定位下一个目标字符:

declare @name varchar(100) ='kalee@swara@n@r'
select 
    CHARINDEX('@', @name) as First_At_Position,
    CHARINDEX('@', @name, CHARINDEX('@', @name) + 1) as Second_At_Position,
    CHARINDEX('@', @name, CHARINDEX('@', @name, CHARINDEX('@', @name) + 1) + 1) as Third_At_Position

执行后会直接返回三个@的位置:6、12、14,和你原来三次查询的结果完全一致,但只需要一条SELECT语句。

方法二:用CTE递归查找(适合不确定目标字符出现次数的场景)

如果不确定目标字符会出现多少次,递归CTE是更灵活的选择,它能自动找出所有匹配的位置,返回一个包含所有位置的结果集:

declare @name varchar(100) ='kalee@swara@n@r'
declare @search_char char(1) = '@'

;WITH Char_Positions AS (
    -- 初始查询:找到第一个@的位置,同时设置下一次搜索的起始点
    SELECT 
        CHARINDEX(@search_char, @name) AS Position,
        CHARINDEX(@search_char, @name) + 1 AS Next_Start
    WHERE CHARINDEX(@search_char, @name) > 0
    UNION ALL
    -- 递归查询:从上一次的起始点继续找下一个@,直到找不到为止
    SELECT 
        CHARINDEX(@search_char, @name, Next_Start) AS Position,
        CHARINDEX(@search_char, @name, Next_Start) + 1 AS Next_Start
    FROM Char_Positions
    WHERE CHARINDEX(@search_char, @name, Next_Start) > 0
)
SELECT Position AS At_Position FROM Char_Positions;

这个查询会返回三行结果,每行对应一个@的位置:

At_Position
-----------
6
12
14

两种方法各有优势,你可以根据实际需求选择~

内容的提问来源于stack exchange,提问作者user19305928

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 15:52:45