【问题标题】:Oracle: get part string from a stringOracle:从字符串中获取部分字符串
【发布时间】:2009-09-25 17:16:12
【问题描述】:

我有一个来自 oracle 表的字符串,如下所示:

 SELECT col1 FROM MyTable;
 col1
 part1;part2;part3
 ....

如何从 col1 获取子字符串,例如 part2?

 SELECT col1, INSTR(col1, ';', 1, ...) SubStrPart2 // string func?
 col1       SubStrPart2
 ....       part2

不确定我可以在这里使用哪些字符串函数以便我可以轻松更新它以获取特定的子字符串部分?

【问题讨论】:

    标签: sql oracle plsql


    【解决方案1】:

    如果你想用分号分开,你可以试试这样:

    select col1
         , regexp_substr(col1, '^[^;]') as part1
         , replace(regexp_substr(col1, ';[^;]+;'), ';') as part2
         , replace(regexp_substr(col1, ';[^;]+$'), ';') as part3
    

    如果没有给出第三个参数,replace 函数会删除所有出现的第二个参数。

    【讨论】:

      【解决方案2】:

      如果您希望在第一次和第二次出现 ';' 之间排除 col1 的“切片”,那么正确的方法应该是......:

      select substr(col1, 
                    instr(col1, ';', 1, 1)+1,
                    instr(col1, ';', 1, 2)-instr(col1, ';', 1, 1)-1)
      

      这有点复杂,因为您需要指定要采用的第一个字符,然后是要采用的字符数(这里可能有一个不一样的,需要检查,但我确实相信那些 +1 和 - 1 是正确的)。

      【讨论】:

        【解决方案3】:

        This is a good reference 关于这些功能。

        SELECT col1, SUBSTR(col1, INSTR(col1, ';', 1, ...)) SubStrPart2 // string func?
         col1       SubStrPart2
         ....       part2
        

        您也可以使用CASE 语句:

        SELECT col1,
               CASE WHEN INSTR(col1, ';', 1, ...) > 0
                    THEN SUBSTR(col1, INSTR(col1, ';', 1, ...))
                    ELSE 'Other value'
               END AS SubStrPart2
        ...
        

        另见these examples

        【讨论】:

          猜你喜欢
          • 2012-07-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-02-02
          相关资源
          最近更新 更多