sql >> Databasteknik >  >> RDS >> PostgreSQL

Beställ varcharsträng som numerisk

Det är absolut möjligt.

ORDER BY varchar_column::int

Se till att ha giltiga heltalsliteraler i din varchar kolumn för varje post eller så får du ett undantag invalid input syntax for integer: ... . (Inledande och efterföljande blanksteg är ok - det kommer att trimmas automatiskt.)

Om så är fallet, varför inte konvertera kolumnen till integer till att börja med? Mindre, snabbare, renare, enklare.

Hur undviker man undantag?

För att ta bort icke-siffriga tecken före skådespelet och därmed undvika möjliga undantag:

ORDER BY NULLIF(regexp_replace(varchar_column, '\D', '', 'g'), '')::int
  • regexp_replace() expression tar effektivt bort alla icke-siffror, så bara siffror kvarstår eller en tom sträng. (Se nedan.)

  • \D är en förkortning för teckenklassen [^[:digit:]] , vilket betyder alla icke-siffror ([^0-9] ).
    I gamla Postgres-versioner med den föråldrade inställningen standard_conforming_strings = off , du måste använda Posix escape-strängsyntax E'\\D' för att undvika omvänt snedstreck \ . Detta var standard i Postgres 8.3, så du behöver det för din föråldrade version.

  • Den fjärde parametern g är för "globalt" , som instruerar att ersätta alla händelser, inte bara den första.

  • Du får vill tillåta ett inledande bindestreck (- ) för negativa tal.

  • Om strängen inte har några siffror alls, är resultatet en tom sträng som inte är giltig för en cast till integer . Konvertera tomma strängar till NULL med NULLIF . (Du kan överväga 0 istället.)

Resultatet är garanterat giltigt. Denna procedur är för en cast till integer som begärts i brödtexten i frågan, inte för numeric som rubriken nämner.

Hur gör man det snabbt?

Ett sätt är ett index på ett uttryck.

CREATE INDEX tbl_varchar_col2int_idx ON tbl
(cast(NULLIF(regexp_replace(varchar_column, '\D', '', 'g'), '') AS integer));

Använd sedan samma uttryck i ORDER BY klausul:

ORDER BY
cast(NULLIF(regexp_replace(varchar_column, '\D', '', 'g'), '') AS integer)

Testa med EXPLAIN ANALYZE om funktionsindexet faktiskt används.



  1. Skillnaden mellan läs commited och repeterbar läsning

  2. Använd Skapa uttalande för att skapa tabell i SQL Server - SQL Server / T- SQL Tutorial Del 34

  3. Plsql för att stava nummer (valuta) till italiensk valuta utan hårdkodat översättningsnummer

  4. Övervakning av Percona Server för MySQL - nyckelmått