最近的專案中使用了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 起始位置,從第幾個字元開始正規表示...