我需要从这种类型的字符串中检索原始数字(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。
答案 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
答案 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;