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
当然,最好使用SUBSTR和INSTR,因为它们的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给出的示例没有非字母数字字符。但是,是的,最好是安全的谢谢你指出这一点