Oracle 根據字母 數字的字段排序

2021-09-08 12:50:24 字數 1088 閱讀 4663

最近的專案中使用了ztree來編寫頁面中使用的樹形目錄,在資料庫中儲存的時候有乙個treecode欄位,形如「root.1.1」,分別代表根節點下第一層目錄的第乙個節點,新建節點的時候要根據已存在的同級節點的最大treecode來生成新的treecode。

開始測試的時候資料量很少,直接根據treecode進行降序排序,取到最大的乙個字段進行+1操作就可以了,

比如取到最大的值是

」root.1.9「

那麼新節點的treecode就是

「root.1.10」

當到第11個的時候發現新生成的treecode依舊是"root.1.10"。

原因是資料型別,資料庫在排序的時候會將這列按照字元型別進行排序處理。oracle會按順序從前到後一位一位的比較兩個字串的值,如果發現到不同的字元,就按照編碼進行比較大小。我們的例子中,兩個字串長度不一樣,當資料庫比較到第八位的時候,9是大一1的,所以」root.1.9「大於"root.1.10"。

在order by 的時候使用函式擷取要比較的數字,轉換為數值型別進行排序。

select tree_code from

(select tree_code from

auditor_notes_tree where tree_code like

'root.1.%'

and tree_code not

like

'root.1.%.%'

order

by cast(substr(tree_code,instr(tree_code,

'.',-1

,1)+

1)asinteger

)desc

)where rownum =

1;

首先使用instr函式獲取最後一位」.「的位置,之後根據這個位置使用substr進行擷取,之後使用cast函式進行型別轉換。這樣檢索到的結果就是我們想要的了。

在treecode欄位中前補若干個0,使得比較位相對應。

使"root.1.9"變為」root.001.009「,使」root.1.10「變為」root.001.010「,這樣兩個字串比較的位就會按照正常的邏輯按位進行。

Oracle欄位根據逗號分割查詢資料

需求是表裡的某個字段儲存的值是以逗號分隔開來的,要求根據分隔的每乙個值都能查出來資料,但是不能使用like查詢。資料是這樣的 查詢的sql如下 select from select guid,regexp substr st responsible,1,level responsible from ...

Oracle欄位根據逗號分割查詢資料的方法

需求是表裡的某個字段儲存的值是以逗號分隔開來的,要求根據分隔的每乙個值都能查出來資料,但是不能使用like查詢。資料是這樣的 查詢的sql如下 select from 程式設計客棧 select guid,regexp substr st responsible,1,level rwww.cppcn...

ORACLE 表中字段根據逗號拆分多行

這個函式的作用是正則分隔字串,用法為 function regexp substr string,pattern,position,occurrence,modifier srcstr 需要進行正則處理的字串 pattern 進行匹配的正規表示式 position 起始位置,從第幾個字元開始正規表示...