Sql 如何在Oracle中使用substr?

Sql 如何在Oracle中使用substr?,sql,database,oracle,Sql,Database,Oracle,有一个表列消息值为 Command triggerEvent started Command stopService stopped Command startService started Command executeCommand running ...... 现在我想选择命令名,即triggerEvent、stopService、startService 我尝试使用oracle substr和instr获取它们,但失败了 select substr(message, instr(mes

有一个表列消息值为

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

有什么好办法吗?

您可以使用REGEXP\u 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

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

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:]]字符类,如果命令包含字母表以外的字符,该怎么办。结果将为空。与其依赖字符串,不如使用分隔符。你是对的。但是OP给出的示例没有非字母数字字符。但是,是的,最好是安全的谢谢你指出这一点