Oracle

在 SQL 查詢中按名稱和多音節數字對街道進行排序

  • June 20, 2021

在 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上查看此解決方案的現場展示。

引用自:https://dba.stackexchange.com/questions/294070