簡單描述一下狀況,就是存儲過程當中用一個字符串類型的字段做爲患者就診的排序號,結果莫名發現叫完1號後叫了十一、12等患者。用戶的反饋不必定準確,本身加了日誌的,趕忙拷貝日誌來觀察一下。結果發現實際狀況就是這樣的,一邊說着不該該呀,一邊開始看代碼,一個個分析排序用到的字段,通過分析後發現因爲這個字段是字符串因此排序規則是一個字符一個字符的比較的,單獨寫語句測試一下,果真如此。正則表達式
WITH T AS
(SELECT '11' STR
FROM DUAL
UNION ALL
SELECT '2' STR FROM DUAL
UNION ALL
SELECT '3' STR FROM DUAL
UNION ALL
SELECT '21' STR FROM DUAL
UNION ALL
SELECT '30' STR FROM DUAL
UNION ALL
SELECT '1' STR FROM DUAL)
SELECT * FROM T ORDER BY STR;測試
輸出結果以下:spa
1 1
2 11
3 2
4 21
5 3
6 30日誌
因爲該字段會存儲中文字符,最終利用 狀態 字段和取字符串的數字部分轉換爲數值,而後進行排序。至於regexp
取其中的數字部分,使用正則表達式排序
to_number(regexp_substr(nvl(字段a,0),'[0-9]+'))字符串
記錄一下本身遇到的坑,可能很簡單,可是容易忽視。勤於實踐、樂於記錄,熱愛分享。存儲過程