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
相关产品推荐
相关产品推荐

