如何提取@等特定特殊字符后的内容,无该字符时正确返回原字符串
问题根因
你现有代码运行异常的核心原因是:charindex 函数在字符串中未匹配到 @ 时会返回 0,直接将 0 作为 substr 的起始位置会触发数据库字符串截取函数的异常计算逻辑,最终返回重复的原字符串。
另外需要注意你代码中的 charindex 参数顺序存在书写错误,标准SQL中该函数的语法为 charindex(要查找的子串, 目标字符串, 起始查找位置),参数顺序颠倒也可能导致匹配结果不符合预期。
修复方案
写法1:通用条件判断(适配所有SQL方言,可读性高)
通过 CASE 语句先判断是否存在 @,再决定截取逻辑,同时调整截取起始位 +1 跳过 @ 符号本身:
res := CASE WHEN charindex('@', str, 1) > 0 THEN substr(str, charindex('@', str, 1) + 1, length(str)) ELSE str END;
写法2:简洁函数式写法(适配支持 coalesce、nullif 的主流数据库)
通过函数组合省略显式的条件判断,代码更精简:
res := coalesce(substr(str, nullif(charindex('@', str, 1), 0) + 1), str);
逻辑说明:nullif 会把未匹配到 @ 时返回的 0 转为 null,substr 接收 null 作为起始位时会返回 null,最后用 coalesce 将 null 值替换为原字符串即可。
内容的提问来源于stack exchange,提问作者user739115
相关产品推荐
相关产品推荐

