【问题标题】:Extract nth substring [duplicate]提取第 n 个子字符串 [重复]
【发布时间】:2018-06-27 23:21:53
【问题描述】:

我需要从一个字符串中提取一个子字符串。下面给出了可用的 ID。

0234-RDRT-RS111-M-EU

0234-RDRT-RSD123-M-EU

我需要将突出显示的内容提取到列中。如何将所有字符提取到 Microsoft SQL Server 中的同一列。

【问题讨论】:

  • 刚刚编辑了查询。
  • 数据是否总是位于第二个破折号之后?
  • 是的,我需要提取不同列中每个破折号后可用的所有数据。
  • 当你在寻找常量时,为什么不like '%-%-RSD123-%-%'
  • @AlexK。如果总是有固定数量的分隔字符串,那么这可能会起作用,但如果输入可以是 111-222-333-RDS123-555-666,那么即使它匹配第 4 个分隔项而不是预期的第 3 个,它也会匹配它。

标签: sql sql-server oracle substr


【解决方案1】:

REGEX_SUBSTR的第四个参数是被调用的occurence。您只需为每列设置要查看的出现次数:

CREATE TABLE T (id varchar2(30));
INSERT INTO T VALUES ('0234-RDRT-RS111-M-EU');
INSERT INTO T VALUES ('0234-RDRT-RSD123-M-EU');

SELECT regexp_substr(id,'[^-]+',1,1) as col1,
       regexp_substr(id,'[^-]+',1,2) as col2,
       regexp_substr(id,'[^-]+',1,3) as col3,
       regexp_substr(id,'[^-]+',1,4) as col4,
       regexp_substr(id,'[^-]+',1,5) as col5
  FROM t;

COL1    COL2    COL3    COL4    COL5
0234    RDRT    RS111   M   EU
0234    RDRT    RSD123  M   EU

有关详细信息,请参阅 Oracle 文档中的 REGEX_SUBSTR

【讨论】:

  • 谢谢。我如何在这个表达式中指定我想要的字符数?
  • 不客气。您通常指定字符的种类,而不是数字。 [] 是一组字符,^- 表示除减号之外的任何内容,+ 表示一个或多个。您确实可以使用类似 '[0-9]{3,5}' 表示 3 到 5 位数字或 [A-Z0-9]{2,6} 表示 2 到 6 个字母或数字等来指定数字。参见here完整列表。
  • 感谢您的支持。我能够得到我需要的数据。
【解决方案2】:

您可以提取列 id 的所有值,方法是在破折号上拆分它们

select regexp_substr(id,'[^-]+', 1, level) 
from (select '0234-RDRT-RSD123-M-EU' as id 
        from dual)
connect by regexp_substr(id, '[^-]+', 1, level) is not null

结果有 5 行。 然后,您可以根据需要利用结果

【讨论】:

    【解决方案3】:

    根据'-'进行拆分,存储在字符串数组中,然后取第三个元素。

    【讨论】:

    • 这更像是一个评论而不是一个答案。如果你想改进它,请展示一个完整的代码 sn-p 可以在 Oracle SQL 中工作(这是问题的标记)。
    猜你喜欢
    • 2022-12-18
    • 1970-01-01
    • 1970-01-01
    • 2016-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多