none
Zahlen sortieren die in einem varchar(50) liegen RRS feed

  • Frage

  • Hi, wie sortiere ich am besten folgende Zahlenwerte aufsteigend, die in einer SQL Tabelle in einem varchar liegen.
    Ich habe in der Tabelle
    1
    2
    ..
    9
    10
    11
    12
    ...
    20
    21...
    A 1
    A 2
    C1
    c2
    d1

    usw.

    drin, wenn ich jetzt order by Spalte asc selektiere bekomme ich
    1
    10
    100
    11
    110
    12
    13
    2
    20
    usw.

    ich muss aber irgendwie
    1
    2
    3
    4
    ...
    10
    11

    haben. Ich stelle die Daten anschließend in einem Grid dar.Wie bewerkstellige ich das am besten?
    Gruss

     

     

    Freitag, 7. Januar 2011 10:18

Antworten

  • Hallo Thomas,
    Nur sind natürlich jetzt die Ascii Datensätze (wie A1,C23,D6) nicht dabei.

    schrieb ich ja, dass die dann fehlen.

    WITH SortedValues( <Spalte>, Type, RowNumber )
    AS
    (
     SELECT  <Spalte>, 1 AS Type, ROW_NUMBER() OVER( ORDER BY CONVERT( int, Value ) )
     FROM   <Tabelle>
     WHERE  ISNUMERIC( <Spalte> ) = 1
     UNION ALL
     SELECT  <Spalte>, 2 AS Type, ROW_NUMBER() OVER( ORDER BY Value )
     FROM   <Tabelle>
     WHERE  ISNUMERIC( <Spalte> ) = 0
    )
    
    SELECT *
    FROM  SortedValues
    ORDER BY Type, RowNumber
    
    

    sollte das gewünschte ausgeben.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Freitag, 7. Januar 2011 12:42
    Moderator

Alle Antworten

  • Hallo Thomas,

    Hi, wie sortiere ich am besten folgende Zahlenwerte aufsteigend, die in einer SQL Tabelle in einem varchar liegen.

    gar nicht. Es wäre viel sinnvoller, Zahlen auch aus Zahl zu speichern. Dann kann man die auch problemlos sortieren.

    In deinem Fall hast Du zwar die Möglichkeit, eine Konvertierung der Zahlenwerte vorzunehmen aber dann fallen natürlich alle alphanumerischen Werte beim SELECT raus.

    SELECT  *
    FROM   <Tabelle>
    WHERE  ISNUMERIC( <Spalte> ) = 1
    ORDER BY CONVERT( int, <Spalte> )
    
    

    Mittels UNION kriegt man die Daten IIRC auch nicht wieder zusammen. Man kann aber eine Function schreiben, die die Werte nacheinander sortiert in eine Table Variable schreibt (ggfs. mit einem zusätzlichen Feld, damit man hinterher auch weiß, was nun als Zahl und was als String geschrieben wurde)

     

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Freitag, 7. Januar 2011 10:39
    Moderator
  • Hi Stefan, danke für die Zahlen innerhalb der Spalte klappt es mit obigen. Nur sind natürlich jetzt die Ascii Datensätze (wie A1,C23,D6) nicht dabei.
    Jetzt müßte ich die noch irgendwie anschließend noch mal auslesen und diese 2 Datasets mergen, damit ich die ins Grid bekomme?

    Freitag, 7. Januar 2011 10:52
  • Hallo Thomas,
    Nur sind natürlich jetzt die Ascii Datensätze (wie A1,C23,D6) nicht dabei.

    schrieb ich ja, dass die dann fehlen.

    WITH SortedValues( <Spalte>, Type, RowNumber )
    AS
    (
     SELECT  <Spalte>, 1 AS Type, ROW_NUMBER() OVER( ORDER BY CONVERT( int, Value ) )
     FROM   <Tabelle>
     WHERE  ISNUMERIC( <Spalte> ) = 1
     UNION ALL
     SELECT  <Spalte>, 2 AS Type, ROW_NUMBER() OVER( ORDER BY Value )
     FROM   <Tabelle>
     WHERE  ISNUMERIC( <Spalte> ) = 0
    )
    
    SELECT *
    FROM  SortedValues
    ORDER BY Type, RowNumber
    
    

    sollte das gewünschte ausgeben.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Freitag, 7. Januar 2011 12:42
    Moderator