2017-03-07 7 views
0

のような私の入力パターン:希望OracleのSQLでの部分文字列を検索

WITH data_tab AS (
    SELECT '1540_INPUTTER' user_name FROM dual 
    UNION SELECT '1540_RAZZ25_UNKNOWN' FROM dual 
    UNION SELECT '1540_RAKIB17_OS_WIN10' FROM dual 
) 
SELECT REGEXP_SUBSTR(user_name,…………………….....) AS st_user_name from data_tab 

出力:それをする

ST_USER_NAME 
------------ 
INPUTTER 
RAZZ25 
RAKIB17 

答えて

1

一つの方法は、

WITH data_tab AS (
    SELECT '1540_INPUTTER' user_name FROM dual 
    UNION SELECT '1540_RAZZ25_UNKNOWN' FROM dual 
    UNION SELECT '1540_RAKIB17_OS_WIN10' FROM dual 
) 
SELECT REGEXP_SUBSTR(user_name,'_([^_]*)', 1, 1, 'i', 1) AS st_user_name 
FROM data_tab; 
です
+0

いいです。 –

0

それを行うための別の方法は、文字列 の完全な構造を定義し、第二群抽出することである。data_tab FROM

WITH data_tab AS (
    SELECT '1540_INPUTTER' user_name FROM dual 
    UNION SELECT '1540_RAZZ25_UNKNOWN' FROM dual 
    UNION SELECT '1540_RAKIB17_OS_WIN10' FROM dual 
) 
SELECT REGEXP_SUBSTR(user_name,'(\d{4}_)([A-Z0-9]+)(_)?(\w+)?',1,1,'i',2) 

AS st_user_name を。

+0

要件に含まれていないファクトは、データ内に表示されていると仮定しないでください。 OPは最初の部分については何も言わなかった、最初のアンダースコアまでは正確に4桁であった。少なくとも、このようなことをする前に、OPに確認を依頼してください。 – mathguy

0

これを確認してください。

WITH data_tab AS (
    SELECT '1540_INPUTTER' user_name FROM dual 
    UNION SELECT '1540_RAZZ25_UNKNOWN' FROM dual 
    UNION SELECT '1540_RAKIB17_OS_WIN10' FROM dual 
) 
SELECT 

case when INSTR(SUBSTR(user_name, INSTR(user_name, '_')+1, length(user_name)- INSTR(user_name, '_')+1),'_') =0 then 

SUBSTR(user_name, INSTR(user_name, '_')+1, length(user_name)- INSTR(user_name, '_')+1) 

else 

substr((SUBSTR(user_name, INSTR(user_name, '_')+1, length(user_name)- INSTR(user_name, '_')+1)), 1, INSTR(SUBSTR(user_name, INSTR(user_name, '_')+1, length(user_name)- INSTR(user_name, '_')+1),'_') -1) 

end as user_name 

from data_tab 
-1

はここで標準の文字列操作を使用して経済的な方法である(あるなし、正規表現、より多くの時間がかかり)と特殊な状況(追加試験データを参照)のすべての種類を扱います。

with data_tab as (
     select '1540_INPUTTER'  user_name from dual union all 
     select '1540_RAZZ25_UNKNOWN'   from dual union all 
     select '1540_RAKIB17_OS_WIN10'   from dual union all 
     select 'MATHGUY_'      from dual union all 
     select 'NOUNDERSCORES'     from dual 
    ) 
select user_name, 
     substr(user_name, nullif(instr(user_name, '_'), 0) + 1, 
       instr(user_name || '_', '_', 1, 2) - instr(user_name, '_') - 1) 
                     as st_user_name 
from data_tab 
; 

USER_NAME    ST_USER_NAME 
--------------------- ------------ 
1540_INPUTTER   INPUTTER 
1540_RAZZ25_UNKNOWN RAZZ25 
1540_RAKIB17_OS_WIN10 RAKIB17 
MATHGUY_ 
NOUNDERSCORES 
関連する問題