SQL中按行查找首个字母位置,需替代CHARINDEX实现多子串匹配
查找字符串中首个字母字符的位置(替代CHARINDEX多子串匹配)
方案1:使用PATINDEX函数(推荐)
大部分主流SQL数据库(SQL Server、MySQL、PostgreSQL等)都支持PATINDEX函数,它支持通配符模式匹配,可直接定位第一个字母的位置:
SELECT [Loan #], PATINDEX('%[A-Za-z]%', [Loan #]) AS [Loan Substring] FROM 你的数据集表名;
说明:
%[A-Za-z]%是匹配模式,%表示任意字符(包括空),[A-Za-z]匹配任意大小写英文字母- 函数会返回第一个符合匹配模式的字符位置,完全符合你给出的示例结果:
1234BL返回5,123BL返回4,12SBL返回3
方案2:递归CTE+字符遍历(兼容小众数据库)
如果你的数据库不支持PATINDEX,可以用递归生成数字序列,逐个检查每个位置的字符是否为字母,取最小的匹配位置:
WITH NumberSequence AS ( SELECT 1 AS pos UNION ALL SELECT pos + 1 FROM NumberSequence WHERE pos < (SELECT MAX(LEN([Loan #])) FROM 你的数据集表名) ) SELECT [Loan #], MIN(CASE WHEN SUBSTRING([Loan #], pos, 1) LIKE '[A-Za-z]' THEN pos END) AS [Loan Substring] FROM 你的数据集表名 CROSS JOIN NumberSequence WHERE pos <= LEN([Loan #]) GROUP BY [Loan #] OPTION (MAXRECURSION 0); -- SQL Server需添加此参数取消递归层数限制
方案3:自定义函数(复用性高)
如果需要多次使用该逻辑,可创建自定义函数:
-- SQL Server示例,其他数据库语法略有差异 CREATE FUNCTION dbo.GetFirstLetterPosition(@inputStr VARCHAR(255)) RETURNS INT AS BEGIN DECLARE @currentPos INT = 1; WHILE @currentPos <= LEN(@inputStr) BEGIN IF SUBSTRING(@inputStr, @currentPos, 1) LIKE '[A-Za-z]' RETURN @currentPos; SET @currentPos = @currentPos + 1; END RETURN 0; -- 无字母时返回0,可根据需求调整 END;
调用函数:
SELECT [Loan #], dbo.GetFirstLetterPosition([Loan #]) AS [Loan Substring] FROM 你的数据集表名;
内容的提问来源于stack exchange,提问作者That_non_coder
相关产品推荐
相关产品推荐

