我在從資料庫中檢索 MAX 編號時遇到問題。問題是數字是字串格式,因為它們包含下劃線。
示例案例:我在資料庫中有 3 個數字:
123456_1、123456_2、123456_13、
我想獲取的 MAX 數字是 123456_13 (基本上是下劃線后最大的),但由于它們是字串,Oracle 按字母順序處理它們并按升序排列:
- 123456_1
- 123456_13
- 123456_2
使 123456_2 成為 MAX。
如果我不需要通過替換下劃線并轉換為數字來顯示實際的 MAX 或 MIN 數字,這是可能的:
SELECT
MAX(TO_NUMBER(REPLACE(number,'_',''))) max_nr,
MIN(TO_NUMBER(REPLACE(number,'_',''))) min_nr
FROM
...
這將從我的 3 個示例中回傳 12345613 max_nr 1234561 min_nr,但我需要使用下劃線獲取實際數字并顯示它。
有沒有辦法做到這一點?
uj5u.com熱心網友回復:
您可以使用REPLACEinORDER BY陳述句和FETCH FIRS 1 ROW
select *
from T
order by TO_NUMBER(REPLACE(N,'_','')) desc
fetch first 1 rows only;
SQLize - 在線編輯器
uj5u.com熱心網友回復:
你可以有這樣的東西:
WITH
tbl AS
(
Select '87789_09' "NBR" From Dual Union All
Select '9877_1' "NBR" From Dual Union All
Select '12344_13' "NBR" From Dual Union All
Select '989898_10' "NBR" From Dual
)
Select NBR, Max(To_Number(SubStr(NBR, InStr(NBR, '_') 1))) "PART_NBR"
From tbl
Group By NBR
Order By Max(To_Number(SubStr(NBR, InStr(NBR, '_') 1)))
/* Result:
NBR PART_NBR
--------- ----------
9877_1 1
87789_09 9
989898_10 10
12344_13 13
*/
在下劃線之后使用 NBR 列的一部分,將其與自身分開并轉換為數字,您可以進一步選擇(您也可以直接進行)您需要的 - 最小值,最大值,等等......
問候...
uj5u.com熱心網友回復:
如果你想同時得到最小值和最大值,你可以使用keep語法兩次,按下劃線后所有字符的數字等值排序:
select
max(your_number)
keep (dense_rank last
order by to_number(substr(your_number, instr(your_number, '_') 1))
) as max_number,
min(your_number)
keep (dense_rank first
order by to_number(substr(your_number, instr(your_number, '_') 1))
) as min_number
from your_table
| MAX_NUMBER | MIN_NUMBER |
|---|---|
| 123456_13 | 123456_1 |
小提琴
instr(your_number, '_')給出下劃線的位置;substr(your_number, instr(your_number, '_') 1)給你下劃線之后的一切。
如果值在下劃線之前的位數并不總是相同,那將起作用,如果您只是洗掉它可能會出現問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/533253.html
