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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 07:05:27