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

如何在SQL字符串中查找指定字符的索引?查询仅返回1的问题分析

为啥只输出1?

你用的CHARINDEX()函数有个特点——它只会返回指定字符在字符串里第一次出现的起始位置。你的输入'K#,K+,K'第一个字符就是K,所以只会返回1,不会主动去查找后面的K。

要找所有K的位置?试试这两种方法

如果想把字符串里所有K的索引都找出来,有两种常用的实现方式:

方法1:递归CTE

DECLARE @input NVARCHAR(100) = 'K#,K+,K'
DECLARE @searchChar NVARCHAR(1) = 'K'

;WITH CharPositions AS (
    -- 先找第一个K的位置
    SELECT CHARINDEX(@searchChar, @input) AS Position
    WHERE CHARINDEX(@searchChar, @input) > 0
    UNION ALL
    -- 从上个位置的下一位开始找下一个K
    SELECT CHARINDEX(@searchChar, @input, Position + 1) AS Position
    FROM CharPositions
    WHERE CHARINDEX(@searchChar, @input, Position + 1) > 0
)
SELECT Position FROM CharPositions;

执行完会得到所有K的位置:

Position
--------
1
4
7

方法2:循环遍历

DECLARE @input NVARCHAR(100) = 'K#,K+,K'
DECLARE @searchChar NVARCHAR(1) = 'K'
DECLARE @currentPos INT = 1
DECLARE @pos INT

WHILE @currentPos <= LEN(@input)
BEGIN
    -- 从当前位置开始找K
    SET @pos = CHARINDEX(@searchChar, @input, @currentPos)
    -- 找不到就跳出循环
    IF @pos = 0 BREAK
    PRINT @pos
    -- 把下一次的起始位置设为当前找到的位置+1
    SET @currentPos = @pos + 1
END

运行后会依次打印:

1
4
7
额外提一句

CHARINDEX()可以传第三个参数,就是从哪个位置开始搜索,我们就是靠这个参数实现后续匹配的查找。要是需要区分大小写搜索,就在函数里加上COLLATE Latin1_General_CS_AS,比如CHARINDEX(@searchChar COLLATE Latin1_General_CS_AS, @input COLLATE Latin1_General_CS_AS)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 03:52:20