Oracle
在 SQL 查詢中按名稱和多音節數字對街道進行排序
在 Oracle DB 中有一個包含一些數據的表:
請在此處找到一個最小的可重現範例:http ://www.sqlfiddle.com/#!4/19d625/1
現在我正在嘗試通過
"HNR"
按順序對這些數據進行排序25 > 25A > 25B > 25/3
。因此,最高優先級有一個簡單的數字,然後是帶有字母的相同數字(也已排序),最後是帶有子編號的相同數字/
(已排序)。使用此程式碼
SELECT F.LAG, F.HNR, F.STREET FROM DB.F F ORDER BY F.LAG, F.STREET, TO_NUMBER(regexp_substr(F.HNR, '[[:digit:]]{1,4}')), TO_CHAR(regexp_substr(F.HNR, '[[:alpha:]]{1}')), TO_NUMBER(regexp_substr(F.HNR, '[^/]+', 1, 2));
我得到這個:
而不是這個:
我究竟做錯了什麼?
我見過SQL: ORDER BY 在特定列中使用子字元串……可能嗎?並按字母排序,然後按數字排序,但我沒有發現任何相關的東西。
除了對與您已經實現的那些字元相關的位進行排序之外,我還將根據中特殊字元的存在單獨介紹排序。
HNR
您可以嘗試使用
REGEXP_COUNT
它。您可以這樣做:SELECT F.LAG, F.HNR, F.STREET FROM DB.F F ORDER BY F.LAG, F.STREET, TO_NUMBER(regexp_substr(F.HNR, '[[:digit:]]{1,4}')), regexp_count(F.HNR, '[/]'), -- numbers with strokes follow those without strokes regexp_count(F.HNR, '[[:alpha:]]'), -- no-letter numbers first TO_CHAR(regexp_substr(F.HNR, '[[:alpha:]]{1}')), TO_NUMBER(regexp_substr(F.HNR, '[^/]+', 1, 2));
我在上面添加的兩個附加排序標準將導致以下結果:
如您所見,按特定順序使用它們將為 HNR 生成所需的排序順序。
在 db<>fiddle的 SQL Fiddle上查看此解決方案的現場展示。