>source

테이블 컬럼 메시지 값이 있습니다.

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

이렇게 하는 좋은 방법이 있습니까?

  • 답변 # 1

    하위 문자열에 대한 랍스터와 문자열의 차이점을 확인하십시오!

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

    결과

  • 답변 # 2

    REGEXP_SUBSTR을 사용하여 더 짧은 code로 수행할 수 있습니다.

    예를 들어,

    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
    

  • 답변 # 3

    REGEXP_SUBSTR을 사용하여 더 짧은 code로 수행할 수 있습니다.

    예를 들어,

    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
    

  • 답변 # 4

    이렇게 하면 메시지의 두 번째 단어가 표시됩니다.

    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이 됩니다. 문자열에 의존하는 대신 구분 기호를 사용하는 것이 좋습니다.

    Lalit Kumar B2021-09-23 01:55:59

    당신이 맞습니다. 그러나 OP가 제공한 예제에는 영숫자가 아닌 문자가 없었습니다. 하지만 안전한 것이 더 좋습니다. :) 지적해주셔서 감사합니다.

    Utsav2021-09-23 01:55:59
  • 답변 # 5

    이렇게 하면 메시지의 두 번째 단어가 표시됩니다.

    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이 됩니다. 문자열에 의존하는 대신 구분 기호를 사용하는 것이 좋습니다.

    Lalit Kumar B2021-09-23 01:55:59

    당신이 맞습니다. 그러나 OP가 제공한 예제에는 영숫자가 아닌 문자가 없었습니다. 하지만 안전한 것이 더 좋습니다. :) 지적해주셔서 감사합니다.

    Utsav2021-09-23 01:55:59
  • 이전 Javascript를 사용하여 Json 객체의 일부 추출
  • 다음 SQL Server에서 wgs 84를 위도/경도로 변환하는 방법