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

SQL查询:提取表格中短横线间的中间段字符(禁用SUBSTR)

解决提取短横线间动态长度字符的问题

问题回顾

需求:从格式如PSL-XXX-XX的字符串中提取两个短横线-之间的字符,无法使用固定长度的SUBSTR函数(因中间字符长度不固定)。
数据示例:

MYTABLE
PSL-9-1
PSL-9-2
PSL-10-1
PSL-10-2
PSL-500-1
PSL-8600-1

期望输出:

extracted_value
9
9
10
10
500
8600

不用慌!这个问题核心是动态定位分隔符位置,避开固定长度的限制,下面针对主流数据库给出具体解决方案:

MySQL/MariaDB 解决方案

用SUBSTRING_INDEX函数专门处理按分隔符截取的场景,非常省心:

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(MYTABLE, '-', 2), '-', -1) AS extracted_value
FROM your_table_name;

原理:

  • 内层SUBSTRING_INDEX(MYTABLE, '-', 2)截取到第二个-之前的内容(比如PSL-9、PSL-10);
  • 外层SUBSTRING_INDEX(..., '-', -1)截取最后一个-之后的内容,也就是我们要的中间部分。

SQL Server 解决方案

通过CHARINDEX定位两个-的位置,再用SUBSTRING动态计算截取长度:

SELECT 
    SUBSTRING(
        MYTABLE, 
        CHARINDEX('-', MYTABLE) + 1, 
        CHARINDEX('-', MYTABLE, CHARINDEX('-', MYTABLE) + 1) - CHARINDEX('-', MYTABLE) - 1
    ) AS extracted_value
FROM your_table_name;

原理:

  • CHARINDEX('-', MYTABLE)拿到第一个-的位置;
  • CHARINDEX('-', MYTABLE, CHARINDEX('-', MYTABLE)+1)拿到第二个-的位置;
  • 两个位置的差值减1就是中间内容的长度,用这个动态长度作为SUBSTRING的参数,完美避开固定长度限制。

Oracle 解决方案

思路和SQL Server类似,用INSTR定位分隔符,再用SUBSTR动态截取:

SELECT 
    SUBSTR(
        MYTABLE, 
        INSTR(MYTABLE, '-', 1, 1) + 1, 
        INSTR(MYTABLE, '-', 1, 2) - INSTR(MYTABLE, '-', 1, 1) - 1
    ) AS extracted_value
FROM your_table_name;

原理:

  • INSTR(MYTABLE, '-', 1, 1)是第一个-的位置,INSTR(MYTABLE, '-', 1, 2)是第二个-的位置;
  • 计算出中间内容的起始位置和长度,实现动态截取。

PostgreSQL 解决方案

用STRING_TO_ARRAY把字符串拆成数组,直接取第二个元素(PostgreSQL数组索引从1开始):

SELECT (STRING_TO_ARRAY(MYTABLE, '-'))[2] AS extracted_value
FROM your_table_name;

原理:

  • STRING_TO_ARRAY(MYTABLE, '-')会把PSL-9-1转成数组['PSL', '9', '1'];
  • 直接通过索引[2]获取中间元素,简单直观。

内容的提问来源于stack exchange,提问作者Irv谋ng Ngr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:39:40