如何从pl / sql中的分隔符的字符串中检索数字?

时间:2018-04-13 10:36:12

标签: sql oracle plsql

我需要从这种类型的字符串中检索原始数字(8385): // slv是一个varchar,包含字符串

slv=
DEFAULTLOCALE=S=en_GBORIGIN=L=8385WORKGROUP=L=3MAINORIGIN=L=183CLAIMID=L=7416882

这里使用的分隔符是NAK(否定确认)和ESC(转义)。 另请注意,此字符串是模板,原始数字的长度可能会有所不同。所以我不能使用像:

这样的固定代码

substr(slv,instr(slv,'ORIGIN=L=',1)+9,4); //因为这会获取固定的4个位置,原点数可能会变为3甚至5。

请建议。 TIA

PS-这必须是pl / sql或sql。

4 个答案:

答案 0 :(得分:4)

使用REGEXP_SUBSTR我们可以尝试以下方法:

SELECT
    REGEXP_SUBSTR('DEFAULTLOCALE=S=en_GBORIGIN=L=8385WORKGROUP=L=3MAINORIGIN=L=183CLAIMID=L=7416882',
        'GBORIGIN=L=(\d+)', 1, 1, NULL, 1) origin
FROM dual

8385

Demo

答案 1 :(得分:0)

这是PL / SQL中的一种方法,因为您在评论中提到您希望能够将其保存在变量中以便打印它:

declare
  v_slv varchar2(100) := 'DEFAULTLOCALE=S=en_GBORIGIN=L=8385WORKGROUP=L=3MAINORIGIN=L=183CLAIMID=L=7416882';
  v_origin varchar2(8);
BEGIN
  v_origin := REGEXP_SUBSTR(v_slv, 'GBORIGIN=L=(\d+)', 1, 1, NULL, 1);

  dbms_output.put_line('Origin is: ' || v_origin);
END;

答案 2 :(得分:0)

我认为这有效:

SELECT REGEXP_SUBSTR(str,'[[:digit:]]+') str FROM
(
 SELECT 'slv=DEFAULTLOCALE=S=en_GBORIGIN=L=8385WORKGROUP=L=3MAINORIGIN=L=183CLAIMID=L=7416882' str FROM dual
)
/

输出:8385

答案 3 :(得分:0)

Declare v_val varchar2(255) -- if you just want to print it BEGIN SELECT REGEXP_SUBSTR('slv=DEFAULTLOCALE=S=en_GBORIGIN=L=8385WORKGROUP=L=3MAINORIGIN=L=183CLAIMID=L=7416882','[0-9]+',1,1) into v_val FROM dual; DBMS_OUTPUT.PUT_LINE ("output" || v_val); END;