能否在单条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
相关产品推荐
相关产品推荐

