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

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

Ето един съвет:Винаги, когато имате проблеми със сортирането, добавете ред по елементи към вашата клауза за избор. това ще ви позволи да видите дали това, по което сортирате, всъщност е това, по което искате да сортирате:

SELECT Section,
        CASE WHEN PATINDEX('%[0-9]%',Section) > 1 THEN
          LEFT(Section,PATINDEX('%[0-9]%',Section)-1)
        ELSE 
          Section
        END As alphabetical_sort, -- alphabetical sort
        CASE WHEN PATINDEX('%[0-9]%',Section) > 1 THEN
          CAST(SUBSTRING(Section,PATINDEX('%[0-9]%',Section),LEN(Section)) as float)
        ELSE
          NULL
        END As Numeric_Sort
FROM dbo.Section
ORDER BY alphabetical_sort, Numeric_Sort

След като направих сортирането правилно, всичко, което трябваше да направя, е да преместя операторите за случай в клаузата за реда по:

SELECT Section
FROM dbo.Section
ORDER BY 
    CASE WHEN PATINDEX('%[0-9]%',Section) > 1 THEN
        LEFT(Section,PATINDEX('%[0-9]%',Section)-1)
    ELSE 
        Section
    END , -- Alphabetical sort
    CASE WHEN PATINDEX('%[0-9]%',Section) > 1 THEN
        CAST(SUBSTRING(Section,PATINDEX('%[0-9]%',Section),LEN(Section)) as float)
    ELSE
        NULL
    END  -- Numeric sort

По принцип сте имали 4 основни проблема:

  • Вашият израз за сортиране по азбучен ред предполага, че всеки ред има числа в него.
  • Вашият израз за сортиране по азбучен ред съдържаше числата, както и текста.
  • Вашият числов израз за сортиране имаше както числови, така и азбучни стойности.
  • Поради член 3 не можете да прехвърлите своя израз за числово сортиране към числов тип и това е причината да получите сортиране по низ.

Вижте тази sql цигулка



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. DevOps:DBA или разработчик – Получаване на правилния баланс

  2. Речник на заявките на SQL Server — Стик за промяна за DBA

  3. Изчисляване на стойност с помощта на предишна стойност на ред в T-SQL

  4. Как да получа IP адреса на клиента от самия SQL Server 2008?

  5. Връщане на номера на дял за всеки ред при запитване на разделена таблица в SQL Server (T-SQL)