PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Буквено-цифрово сортиране с PostgreSQL

Идеалният начин би бил нормализирането вашите данни и разделете двата компонента на колоната на две отделни колони. Един от типа integer , един text .

С текущата таблица можете да направите нещо като демонстрирано тук:

WITH x(t) AS (
    VALUES
     ('10_asdaasda')
    ,('100_inkskabsjd')
    ,('11_kancaascjas')
    ,('45_aksndsialcn')
    ,('22_dsdaskjca')
    ,('100_skdnascbka')
    )
SELECT t
FROM   x
ORDER  BY (substring(t, '^[0-9]+'))::int     -- cast to integer
          ,substring(t, '[^0-9_].*$')        -- works as text

Същият substring() изразите могат да се използват за разделяне на колоната.

Регулярните изрази са донякъде устойчиви на грешки:

  • Първият регулярен израз избира най-дългия числов низ отляво, NULL ако не са намерени цифри, прехвърлянето към integer не може да се обърка.

  • Вторият регулярен израз избира останалата част от низа от първия знак, който не е цифра или „_“.

Ако долната черта все пак е недвусмислена като разделител, split_part() е по-бързо:

ORDER  BY (split_part(t, '_', 1)::int
          ,split_part(t, '_', 2)

Отговор за вашия пример

SELECT name
FROM   nametable
ORDER  BY (split_part(name, '_', 1)::int
          ,split_part(name, '_', 2)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL:текущ брой редове за заявка „по минута“

  2. Колко различен е PostgreSQL от MySQL?

  3. Функция за динамична заявка на Postgres

  4. Как да избягате от низ, докато съвпадате с шаблон в PostgreSQL

  5. Как да вмъкнете и изтриете данни в PostgreSQL