【问题标题】:How to use substr in Oracle ?如何在 Oracle 中使用 substr?
【发布时间】:2015-11-19 10:09:17
【问题描述】:

有一个表列消息值为

Command triggerEvent started
Command stopService stopped
Command startService started
Command executeCommand running
......

现在我要选择命令名称,即triggerEvent、stopService、startService

我尝试使用 oracle substr 和 instr 来获取它们但失败了...

select substr(message, instr(message, ' ')) from event

有什么好的方法吗?

【问题讨论】:

    标签: sql database oracle


    【解决方案1】:

    您可以使用 REGEXP_SUBSTR 用更短的代码来实现。

    例如,

    SQL> WITH sample_data AS(
      2  SELECT 'Command triggerEvent started' str FROM dual UNION ALL
      3  SELECT 'Command stopService stopped' str FROM dual UNION ALL
      4  SELECT 'Command startService started' str FROM dual UNION ALL
      5  SELECT 'Command executeCommand running' str FROM dual
      6  )
      7  -- end of sample_data mocking as real table
      8  SELECT trim(regexp_substr(str, '[^ ]+', 1, 2)) command
      9  FROM sample_data;
    
    COMMAND
    ------------------------------
    triggerEvent
    stopService
    startService
    executeCommand
    

    当然,最好使用 SUBSTRINSTR,因为它们的 CPU 密集度 仍然比 正则表达式。

    SQL> WITH sample_data AS(
      2  SELECT 'Command triggerEvent started' str FROM dual UNION ALL
      3  SELECT 'Command stopService stopped' str FROM dual UNION ALL
      4  SELECT 'Command startService started' str FROM dual UNION ALL
      5  SELECT 'Command executeCommand running' str FROM dual
      6  )
      7  -- end of sample_data mocking as real table
      8  SELECT trim(SUBSTR(str, instr(str, ' ', 1, 1),
      9                     instr(str, ' ', 1, 2) - instr(str, ' ', 1, 1))
     10              ) command
     11  FROM sample_data;
    
    COMMAND
    ------------------------------
    triggerEvent
    stopService
    startService
    executeCommand
    

    【讨论】:

      【解决方案2】:

      这将为您提供消息中的第二个单词

      with event(message) as (
      select 'command triggerEvent started' from dual union
      select 'Command stopService stopped' from dual) --recreate table
      
      --query start
      select trim(regexp_substr(message,'[[:alpha:]]+ ',1,2)) command FROM event
      

      【讨论】:

      • 您的正则表达式的问题在于它取决于 [[:alpha:]] 字符类,如果命令包含字母以外的字符怎么办。它会导致NULL。与其依赖字符串,不如使用分隔符。
      • 你是对的。但是 OP 给出的示例没有非字母数字字符。但是,是的,最好是安全的。 :) 谢谢指出
      【解决方案3】:

      确保你看到了 substr 的 lob 和字符串之间的区别!

      select 
         substr(test, 4),
         dbms_lob.substr(test, 4)
      from (
         select ('1234567890') test from dual
      );
      

      结果

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-22
        • 1970-01-01
        相关资源
        最近更新 更多