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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 06:45:14