MySQL:如何反向提取字段中指定分隔符间的数字字符串?
解决方案
针对你的需求,要提取ACCOUNT_NUMBER字段中--与前一个-之间的数字(支持任意长度),以下是不同数据库下的实现方式:
一、通用字符串函数方法(兼容多数数据库版本)
核心思路是先截取--之前的内容,再从中提取最后一个-之后的部分,无需依赖正则:
MySQL/MariaDB
SELECT SUBSTRING_INDEX( SUBSTRING_INDEX(`ACCOUNT_NUMBER`, '--', 1), '-', -1 ) AS extracted_number FROM BankingActivity;
解释:
SUBSTRING_INDEX(ACCOUNT_NUMBER, '--', 1):获取--分隔的第一部分(即--之前的所有内容)SUBSTRING_INDEX(..., '-', -1):在上述结果中,提取-分隔的最后一部分,也就是目标数字
PostgreSQL
SELECT SPLIT_PART(SPLIT_PART(ACCOUNT_NUMBER, '--', 1), '-', -1) AS extracted_number FROM BankingActivity;
解释:
SPLIT_PART(ACCOUNT_NUMBER, '--', 1):截取--之前的内容SPLIT_PART(..., '-', -1):提取上述内容中最后一个-之后的部分
SQL Server
SELECT RIGHT( LEFT(ACCOUNT_NUMBER, CHARINDEX('--', ACCOUNT_NUMBER) - 1), LEN(LEFT(ACCOUNT_NUMBER, CHARINDEX('--', ACCOUNT_NUMBER) - 1)) - CHARINDEX('-', REVERSE(LEFT(ACCOUNT_NUMBER, CHARINDEX('--', ACCOUNT_NUMBER) - 1))) + 1 ) AS extracted_number FROM BankingActivity;
二、正则表达式方法(适合支持正则的高版本数据库)
如果你的数据库支持正则函数,写法会更简洁:
MySQL 8.0+
SELECT REGEXP_SUBSTR(`ACCOUNT_NUMBER`, '-([0-9]+)--', 1, 1, 'c', 1) AS extracted_number FROM BankingActivity;
解释:正则-([0-9]+)--匹配-数字--的模式,最后一个1表示提取括号内的数字捕获组
PostgreSQL
SELECT (REGEXP_MATCH(ACCOUNT_NUMBER, '-([0-9]+)--'))[1] AS extracted_number FROM BankingActivity;
SQL Server 2016+
SELECT REGEXP_SUBSTR(ACCOUNT_NUMBER, '-([0-9]+)--', 1, 1, '', 1) AS extracted_number FROM BankingActivity;
内容的提问来源于stack exchange,提问作者BTC75
相关产品推荐
相关产品推荐

