如何在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
相关产品推荐
相关产品推荐

