SQL Server 2017中CHARINDEX查找多个CHAR(10)返回错误位置求助
解决SQL Server中查找多个CHAR(10)位置的错误问题
你当前的问题出在第三个CHARINDEX的起始位置计算逻辑上,完全搞错了搜索起点的规则。
错误原因分析
你写的第三个换行位置计算式:
CHARINDEX(CHAR(10),subadres,(CHARINDEX(CHAR(10),subadres)+1)+(CHARINDEX(CHAR(10),subadres)))
是把第一个换行的位置重复相加再加1,这根本不是第二个换行之后的正确起始点。找第三个换行时,必须从第二个换行的位置+1开始搜索,而不是基于第一个换行的位置做无意义的乘法。
正确写法
嵌套CHARINDEX写法
直接嵌套计算每个位置,确保每次搜索都从上一个换行的下一位开始:
SELECT subadres, CHARINDEX(CHAR(10), subadres) AS '1st linebreak', CHARINDEX(CHAR(10), subadres, CHARINDEX(CHAR(10), subadres) + 1) AS '2nd linebreak', CHARINDEX(CHAR(10), subadres, CHARINDEX(CHAR(10), subadres, CHARINDEX(CHAR(10), subadres) + 1) + 1) AS '3rd linebreak' FROM your_table;
更清晰的CROSS APPLY写法
如果觉得嵌套太繁琐,用CROSS APPLY分步计算每个位置,可读性更强:
SELECT subadres, pos1 AS '1st linebreak', pos2 AS '2nd linebreak', pos3 AS '3rd linebreak' FROM your_table CROSS APPLY (SELECT CHARINDEX(CHAR(10), subadres) AS pos1) ca1 CROSS APPLY (SELECT CHARINDEX(CHAR(10), subadres, pos1 + 1) AS pos2) ca2 CROSS APPLY (SELECT CHARINDEX(CHAR(10), subadres, pos2 + 1) AS pos3) ca3;
为什么修剪末尾换行没用?
你的问题核心是起始位置计算错误,和字符串末尾有没有多余换行无关。就算去掉末尾的换行,错误的计算逻辑还是会返回错误的第三个换行位置。
内容的提问来源于stack exchange,提问作者snijder
相关产品推荐
相关产品推荐

