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

Oracle中如何拆分拼接字符串?求SQL语句修正指导

解决Oracle字符串按连字符拆分到多列的问题

嗨,我来帮你搞定这个字符串拆分的问题!首先咱们先看看你之前的查询为啥不对——你用了INSTR('3-123456-ABC', '-', -1, 1),这个-1参数是从字符串末尾开始查找第一个连字符,所以定位到的是第二个-的位置,再配合SUBSTR从第3位开始截取,自然就拿到了后面的123456-ABC,不是你想要的第一列。

下面给你两种靠谱的解决方案,都能把3-123456-ABC拆成三个独立列:

方法一:用INSTR精准定位分隔符位置

这种方法适配Oracle所有版本,通过多次调用INSTR找到第一个和第二个连字符的位置,再用SUBSTR截取对应片段:

SELECT
  -- 提取第一列:从开头到第一个连字符前
  SUBSTR('3-123456-ABC', 1, INSTR('3-123456-ABC', '-') - 1) AS first_col,
  -- 提取第二列:从第一个连字符后到第二个连字符前
  SUBSTR('3-123456-ABC', 
         INSTR('3-123456-ABC', '-') + 1, 
         INSTR('3-123456-ABC', '-', INSTR('3-123456-ABC', '-') + 1) - INSTR('3-123456-ABC', '-') - 1) AS second_col,
  -- 提取第三列:从最后一个连字符后到末尾
  SUBSTR('3-123456-ABC', INSTR('3-123456-ABC', '-', -1) + 1) AS third_col
FROM dual;

执行后结果会是:

first_colsecond_colthird_col
3123456ABC

方法二:用REGEXP_SUBSTR正则截取(更简洁)

如果你的Oracle版本是11g及以上,推荐用正则表达式,代码更简洁易读:

SELECT
  -- 取第1个非连字符的片段
  REGEXP_SUBSTR('3-123456-ABC', '[^-]+', 1, 1) AS first_col,
  -- 取第2个非连字符的片段
  REGEXP_SUBSTR('3-123456-ABC', '[^-]+', 1, 2) AS second_col,
  -- 取第3个非连字符的片段
  REGEXP_SUBSTR('3-123456-ABC', '[^-]+', 1, 3) AS third_col
FROM dual;

这里的[^-]+表示匹配除了连字符之外的任意连续字符,最后一个参数1,2,3分别指定取第1、2、3个匹配的片段,结果和方法一完全一致。

内容的提问来源于stack exchange,提问作者sTg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:33:13