sql >> Databáze >  >> RDS >> Sqlserver

Alfanumerické řazení

Zde je tip:Kdykoli máte problémy s řazením, přidejte do vybrané klauzule pořadí podle položek. to vám umožní zjistit, zda to, podle čeho třídíte, je skutečně to, podle čeho chcete třídit:

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

Poté, co jsem seřadil správně, vše, co jsem musel udělat, je přesunout případová prohlášení do pořadí podle klauzule:

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

V podstatě jste měli 4 hlavní problémy:

  • Váš výraz řazení podle abecedy předpokládá, že každý řádek obsahuje čísla.
  • Váš výraz pro řazení podle abecedy obsahoval čísla i text.
  • Váš číselný výraz řazení měl číselné i abecední hodnoty.
  • Vzhledem k článku 3 jste nemohli přetypovat svůj číselný výraz řazení na číselný typ, a proto byste získali řazení podle řetězce.

Zobrazit tyto housle sql



  1. Příklady QUARTER() – MySQL

  2. Kopírovat/duplikovat řádek SQL s blob/textem, jak to udělat?

  3. Jaký je správný název pro tabulku přidružení (vztah mnoho k mnoha)

  4. Jak správně používat AddBatch/withBatch pro hromadné vkládání hodnoty xml tagu do databázové tabulky