我在表格中有一個用于軟體樣式版本號的欄位,即由“點”分隔的一到三個數值,但這些不是十進制數。例如,3.9 之后的版本可能是 3.10,然后是 3.11,等等。我正在嘗試使用 Oracle 中的 REGEX_SUBSTR 構建查詢以查找版本號的不同部分(主要版本、次要版本和 build#):
SELECT version,
to_number(regexp_substr(version, '[^.] ', 1)) major,
to_number(regexp_substr(version, '[^.] ', 2)) minor,
to_number(regexp_substr(version, '[^.] ', 3)) build
FROM mytable
但是,我遇到了一些奇怪的行為,這告訴我我的正則運算式不太正確。例如,如果我的版本號有兩個或三個個位數部分,則第二個數字同時作為“次要”和“構建”數字出現。以下是一些結果示例
"3" -> 3/null/null (the intended behavior)
"3.0" -> 3/0/0
"3.0.1" -> 3/0/0
"33.0" -> 33/3/0
如何更改正則運算式(或整個查詢)以更輕松地正確獲取部分,以及不存在的部分為空?
僅供參考,我從這個關于按版本號排序的老問題中改編了這些表達方式:Find the best version
uj5u.com熱心網友回復:
您缺少對regexp_substr();的論點 您正在為每個搜索提供起始位置,而不是您要匹配的出現位置。
目前它正在做:
- 專業:從第一個字符開始,查找任何非句點字符。
- 次要:從第二個字符開始,查找任何非句點字符。
- build:從第三個字符開始,查找任何非句點字符。
這意味著您的價值觀:
- “3” - 主要從“3”開始并停止,并且找不到任何次要/構建。
- “3.0” - 主要從“3”開始,在第一個時期停止;次要從第二個字符開始,因此“.0”,跳過句點,因為它必須找到至少一個非句點,因此移動到零,并在末尾停止;build 從第三個字符開始,所以是“0”,并在最后停止。
- “3.0.1” - 主要從“3”開始,在第一個時期停止;次要從第二個字符開始,因此“.0”,跳過第一個句點,因為它必須找到至少一個非句點,因此移動到零,并在第二個句點處停止;構建從第三個字符開始,因此是“0”,并且在第二個周期停止。
- “33.3” - 主要從第一個“3”開始并在第一個周期停止,給出 33;次要從第二個字符開始,因此是第二個“3”,并在第一個句點處停止;構建從第三個字符開始,因此“.0”,跳過句點,因為它必須找到至少一個非句點,因此移動到零,并在末尾停止,給出 0。
您需要提供這兩個引數:
SELECT version,
to_number(regexp_substr(version, '[^.] ', 1, 1)) major,
to_number(regexp_substr(version, '[^.] ', 1, 2)) minor,
to_number(regexp_substr(version, '[^.] ', 1, 3)) build
FROM mytable
| 版本 | 重大的 | 次要的 | 建造 |
|---|---|---|---|
| 3 | 3 | 無效的 | 無效的 |
| 3.0 | 3 | 0 | 無效的 |
| 3.0.1 | 3 | 0 | 1 |
| 33.0 | 33 | 0 | 無效的 |
小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/530924.html
標籤:甲骨文子串
上一篇:將JOIN與cte一起使用
