SQL字符串截取求助:如何提取指定目标子串?
嘿,我来帮你搞定这个字符串提取的问题!看你给的几个例子,目标是从那些带PAYPAL的字符串里提取出VAGGRAWA或者VAGGRAWA8这类片段对吧?我给你准备了几种实用的SQL实现方案,你可以根据自己用的数据库来选~
针对不同SQL数据库的实现方案
通用正则表达式方案(推荐,适用于MySQL 8+/SQL Server 2017+/PostgreSQL等支持正则的数据库)
这个方案最灵活,不管PAYPAL后面是*还是空格,都能准确提取目标片段:
SELECT REGEXP_SUBSTR(your_column, 'PAYPAL[ *]([^ ]+)', 1, 1, NULL, 1) AS extracted_value FROM your_table;
正则说明
PAYPAL[ *]:匹配开头的PAYPAL,以及后面跟着的空格或者星号([^ ]+):捕获后面所有非空格的字符(也就是你要的VAGGRAWA/VAGGRAWA8)- 最后一个参数
1表示取第一个捕获组的内容,直接得到目标字符串
测试一下你的例子:
- 输入
PAYPAL *VAGGRAWA 4029357733→ 输出VAGGRAWA - 输入
PAYPAL *VAGGRAWA8 4029357733→ 输出VAGGRAWA8 - 输入
PAYPAL VAGGRAWA8 4029357733→ 输出VAGGRAWA8
MySQL/MariaDB 兼容方案(适合低版本不支持正则的情况)
如果你的MySQL版本比较旧,用字符串替换+截取的方式:
SELECT SUBSTRING_INDEX( SUBSTRING_INDEX(REPLACE(your_column, '*', ' '), ' ', -2), ' ', 1 ) AS extracted_value FROM your_table;
逻辑说明
REPLACE(your_column, '*', ' '):把所有星号换成空格,统一分隔符SUBSTRING_INDEX(..., ' ', -2):取字符串最后两个用空格分隔的部分(也就是目标字符串+末尾数字)SUBSTRING_INDEX(..., ' ', 1):从这部分里取第一个空格前的内容,就是目标字符串
SQL Server 兼容方案
用字符串截取函数处理:
SELECT SUBSTRING( REPLACE(your_column, '*', ' '), CHARINDEX(' ', REPLACE(your_column, '*', ' ')) + 1, CHARINDEX(' ', REPLACE(your_column, '*', ' '), CHARINDEX(' ', REPLACE(your_column, '*', ' ')) + 1) - CHARINDEX(' ', REPLACE(your_column, '*', ' ')) - 1 ) AS extracted_value FROM your_table WHERE your_column LIKE 'PAYPAL%';
逻辑说明
- 先把星号换成空格,统一格式
CHARINDEX(' ', ...)找到第一个空格的位置,+1开始截取- 找到第二个空格的位置,计算出目标字符串的长度,完成截取
PostgreSQL 简洁方案
PostgreSQL的split_part函数非常好用:
SELECT split_part(replace(your_column, '*', ' '), ' ', 2) AS extracted_value FROM your_table;
逻辑说明
- 替换星号为空格
split_part(..., ' ', 2):按空格分割字符串,直接取第2个部分就是目标内容
内容的提问来源于stack exchange,提问作者Vinayak Aggrawal




