我有一張發票表,其中包含以特定方式保存的成本識別符號,不總是標準的,如下所示:
ID | SYMBOL | COST_IDS
--- -------- -------------------
1 | FV01 | '1076219, 1081419'
2 | FV02 | '107621,123421'
3 | FV03 | '111521; 107621'
我想查找特定成本識別符號的發票。
費用的結構是(4位或更多位) (2位年位)
在 Test case: 中107621,所需的輸出將是 ID: 2 and 3。
SELECT * FROM INVOICES WHERE COST_IDS like '7621%'
是錯誤的做法。
我發現我需要使用它REGEXP_LIKE并且我正在努力使用它。我知道我需要準確地找到整個世界,但不一定在開始時。
誰能幫我?
編輯:這似乎在大多數情況下都有效,但在字串末尾失敗:
SELECT *
FROM INVOICES
WHERE REGEXP_LIKE(COST_IDS, '[^|\s|,|;]107621[$|\s|,|;]')
還有沒有辦法標記“非數字”字符而不是專門寫\s|,|;?
為什么$不作業?
uj5u.com熱心網友回復:
您可以使用\D來匹配非數字:
SELECT *
FROM INVOICES
WHERE REGEXP_LIKE(COST_IDS, '(^|\D)107621(\D|$)')
其中,對于樣本資料:
CREATE TABLE invoices (ID, SYMBOL, COST_IDS) AS
SELECT 1, 'FV01', '1076219, 1081419' FROM DUAL UNION ALL
SELECT 2, 'FV02', '107621,123421' FROM DUAL UNION ALL
SELECT 3, 'FV03', '111521; 107621' FROM DUAL;
輸出:
ID 象征 COST_IDS 2 FV02 107621,123421 3 FV03 111521;107621
db<>在這里擺弄
您的正則運算式不起作用:
[^|\s|,|;]匹配單個字符,不任一|或\或s或|或,或|或;[$|\s|,|;]匹配單個字符$或|或\或s或|或,或|或或;
如果要匹配字串開頭或空格字符或逗號或分號,則需要正則運算式(^|\s|[,;])。
同樣,如果要匹配字串結尾或空格字符或逗號或分號,則需要正則運算式($|\s|[,;])。
uj5u.com熱心網友回復:
您可以使用以下 SQL Select 陳述句,因為您有兩個單獨的部分 for cost_ids,或者假設每個cost_ids值只有一種型別的分隔符,即使有更多部分
WITH inv AS
(
SELECT id, REGEXP_SUBSTR(cost_ids,'[[:punct:]] ') AS symbol2, cost_ids
FROM invoices
)
SELECT DISTINCT id
FROM inv
WHERE REGEXP_SUBSTR(cost_ids,'[^'''||symbol2||''' ] ',1,level) = '107621'
CONNECT BY level <= REGEXP_COUNT(cost_ids,symbol2) 1
AND PRIOR SYS_GUID() IS NOT NULL
AND PRIOR id = id
其中分隔符最初是symbol2通過使用[[:punct:]]posix用名稱確定的,posix 用于提取標點符號。
Demo
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/349009.html
下一篇:每個條目的最大日期
