我正在努力構建一個可以在 Oracle 中使用的 regexp_like 陳述句。我需要比較一系列行,每行都有一個欄位,其中包含一組以逗號分隔的數字。(總是數字)。我需要根據這些數字的變化來激活和停用帳戶(每天)。
以下是這些欄位的幾個示例。(下面的每一行都是欄位中的結果)
9,18,31,32,50,725
17,20,31,32,50,725
17,18,20,22,50,725
9,18,31,49,50,500
49,22,9,25,222
18,18,31,9,50,725
49,31,9,25,292
我需要找到具有以下一個或多個數字的任何行。9, 20, 22, 50。(代碼中其他地方可能只需要9,也可能只需要20和22。但原理是成立的。如果數字是500,則不能選擇。必須是50。
以下正則運算式適用于 python、我的記事本 搜索和在線正則運算式構建器:
((?<![1-9])9|(?<![1-9])20(?![1-9])|(?<![1-9])22(?![1-9])|(?<![1-9])50(?![1-9]))
它依賴于負前瞻和負后視。但是因為 Oracle 不支持環視,我很難過。
這是一段示例代碼,如果我使用 regexp 而沒有環顧四周,它就可以作業。
DECLARE
v_search_string varchar2(60);
BEGIN
v_search_string := '49,31,9,25,50,292';
IF REGEXP_LIKE( v_search_string, '((?<![1-9])9|(?<![1-9])20(?![1-9])|(?<![1-9])22(?![1-9])|(?<![1-9])50(?![1-9]))')
THEN
dbms_output.put_line('Yes');
ELSE
dbms_output.put_line('No');
END IF;
--dbms_output.put_line('Yes');
END;
在這種情況下,我應該在我的 dbms_output 中得到“是”,因為它應該匹配“50”。
有什么想法嗎?PS 我對有人說,“嘿,傻瓜,這樣做會更容易。”
uj5u.com熱心網友回復:
我什至不會在這里使用正則運算式:
DECLARE
v_search_string varchar2(60);
BEGIN
v_search_string := '49,31,9,25,50,292';
IF ',' || v_search_string || ',' LIKE '%,9,%' OR ',' || v_search_string || ',' LIKE '%,20,%' OR ',' || v_search_string || ',' LIKE '%,22,%' OR ',' || v_search_string || ',' LIKE '%,50,%'
THEN
dbms_output.put_line('Yes');
ELSE
dbms_output.put_line('No');
END IF;
--dbms_output.put_line('Yes');
END;
為了清楚起見,我們正在,49,31,9,25,50,292,與例如%,9,%進行比較以搜索9CSV 字串中某處的數字。這種方法實際上可能會更好,REGEXP_LIKE因為它不使用正則運算式。
uj5u.com熱心網友回復:
...
where regexp_like(your_string, '(,|^)(9|20|22|50)(,|$)')
...
總的來說,我同意 Tim Biegeleisen 的觀點——盡可能多地使用標準字串函式。
在這種情況下,單個正則運算式搜索可能比同一字串的四個標準字串搜索做得更好;正則運算式方法更靈活。您可以將正則運算式重寫為
'(,|^)(' || things_to_search || ')(,|$)'
并讓我們things_to_search成為用戶輸入,或來自表格等(這將是您必須匹配的以豎線分隔的數字串列)。如果您將它用作系結變數,您將獲得軟決議的好處(無論何時更改串列,都不需要再次決議查詢)。
uj5u.com熱心網友回復:
@mathguy。感謝您將我復雜的陳述變成一個單一的、清晰的陳述。
以逗號或行首開頭;以逗號或行尾結尾;加上中間的東西。更改要搜索的事物的變數并讓我們翻錄。
這是修改后的sql。
DECLARE
v_search_string varchar2(60);
v_things_to_search varchar2(60);
BEGIN
v_search_string := '9,31,29,25,520,500';
v_things_to_search := '9|20|22|50';
IF REGEXP_LIKE( v_search_string, '(,|^)(' || v_things_to_search || ')(,|$)')
THEN
dbms_output.put_line('Yes');
ELSE
dbms_output.put_line('No');
END IF;
--dbms_output.put_line('Yes');
END;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/377523.html
標籤:正则表达式 甲骨文 regex-lookarounds
下一篇:JavascriptRegEx:/(\b\S \b)(?=.*\b\1\b)/在(-,/)存在時洗掉重復的單詞失敗
