如何在SQL中从文本数据里提取带#的完整订单号
提取带#的订单号解决方案
针对你遇到的问题,要精准提取#12340这类带#的数字订单号,需要定位到#的起始位置,再找到后续连续数字的结束位置,以下是不同SQL环境的实现方法:
SQL Server 兼容写法(适配旧版本)
SELECT SUBSTRING( columnname, -- 定位到#的位置 PATINDEX('%#%', columnname), -- 计算需要截取的长度:找到#后第一个非数字的位置,没有则取剩余全部长度 CASE WHEN PATINDEX('%[^0-9]%', SUBSTRING(columnname, PATINDEX('%#%', columnname)+1, LEN(columnname))) > 0 THEN PATINDEX('%[^0-9]%', SUBSTRING(columnname, PATINDEX('%#%', columnname)+1, LEN(columnname))) ELSE LEN(columnname) - PATINDEX('%#%', columnname) + 1 END ) AS order_number FROM your_table
逻辑说明
PATINDEX('%#%', columnname):找到订单号开头#的位置,作为截取的起始点。- 内层通过
SUBSTRING从#后第一个字符开始截取,再用PATINDEX('%[^0-9]%', ...)找到第一个非数字字符的位置,这个位置就是订单号数字部分的长度,加上#本身的1位,就是总截取长度。 - 如果字符串以订单号结尾(没有后续非数字字符),则直接取从
#到字符串末尾的全部长度。
新版/其他SQL方言简化写法
如果你的SQL环境支持正则表达式函数,可以直接用正则匹配连续的#+数字:
- MySQL:
SELECT REGEXP_SUBSTR(columnname, '#[0-9]+') AS order_number FROM your_table;
- PostgreSQL:
SELECT substring(columnname FROM '#[0-9]+') AS order_number FROM your_table;
内容的提问来源于stack exchange,提问作者Hillary Haskins
相关产品推荐
相关产品推荐

