none
Len() liefert unterschiedliche Ergebnisse RRS feed

  • Frage

  • Hallo,

    habe in einer Abfrage als Feld stehen: Select...., len(Alias.Feldname) As Laenge1

    der Ausdruck in Len ist eine als float deklarierte Zahl mit 10 stellen, z.B. 1000000007

    Ich bekomme als Ergebnis aber statt der 10 eine 6.

    Wenn ich statt dem Ausdruck direkt die Zahl schreibe bekomme ich die 10:

    len(1000000007) As Laenge2

    Hintergrund ist dass ich in einer SP Len() im Kriterium einsetzen möchte.

    Kann mir jemand bei der Lösung des Rätsels helfen?

    Gruß Andreas

     

    /Edit/

    habe aus Float decimal 18,0 gemacht, jetzt funktioniert es - seltsam.

    Gruß Andreas


    http://www.AccessBlog.de
    Montag, 1. August 2011 09:30

Antworten

  • Andreas Vogt wrote:

    habe in einer Abfrage als Feld stehen: Select...., len(Alias.Feldname) As
    Laenge1

    der Ausdruck in Len ist eine als float deklarierte Zahl mit 10 stellen,
    z.B. 1000000007

    Ich bekomme als Ergebnis aber statt der 10 eine 6.

    Wenn ich statt dem Ausdruck direkt die Zahl schreibe bekomme ich die 10:

    len(1000000007) As Laenge2

    Hintergrund ist dass ich in einer SP Len() im Kriterium einsetzen möchte.

    Du solltest Deinen Hintergrund genauer erläutern. Was willst Du mit Len() als Kriterium prüfen?

    Wenn Du prüfen willst, welche Zahl grösser ist, vergleiche die Zahlen direkt.

    Wenn Du die Länge der Zeichen Repräsentation von Zahlen vergleichen willst, dann solltest Du diese in ein genortes Format überführen, bevor Du diese vergleichst. Ich denke

    LEN(CAST(CAST(Alias.Feldname AS NUMERIC(20, 0)) AS NVARCHAR(20)))

    könnte helfen, allerdings hat Elmar hier auch auf eine Unsicherheit hingewiesen, welche ich nicht kenne, vielleicht das Vorzeichen oder exponential Darstellungen.
    Falls in in Alias.Feldname auch Strings oder Datumswerte enthalten sein können, dann solltest Du auch bei diesen entsprechend reagieren, z.B. mit den Funktionen ISNUMERIC() oder ISDATE().

    Gruss
    Henry

    • Als Antwort markiert Andreas Vogt Dienstag, 2. August 2011 05:43
    Dienstag, 2. August 2011 04:28
  • Hallo Andreas

    Andreas Vogt wrote:

    ich möchte nur Datenimportieren wo der ID-Wert min. 9 Stellen hat.

    Datensätze mit weniger Stellen im ID-Feld sind ungültig.
    Das mit dem Casten ist ne gute Lösung, danke.

    Und das ist immer eine ganze Zahl? In diesem Fall wäre wohl ein Vergleich

    Alias.FeldName > 999999999

    eher angebracht und mindestens so wirkungsvoll, wie die Zahl zweimal zu casten.

    Gruss
    Henry

    Dienstag, 2. August 2011 05:56

Alle Antworten

  • Hallo Andreas,

    LEN ist eine Zeichenketten-Funktion und so wandelt der SQL Server die Float-Spalte in einen VARCHAR um:

    DECLARE @tabelle TABLE (Spalte float);
    INSERT INTO @tabelle VALUES (1000000007), (1.2345), (0.0), (-1), (123456789012);
    
    SELECT LEN(Spalte), LEN(CONVERT(varchar(23), Spalte, 0)), CONVERT(varchar(23), Spalte, 0)
    FROM @tabelle
    
    
    -- Decimal kaum besser
    DECLARE @tabelle2 TABLE (Spalte decimal(18,0));
    INSERT INTO @tabelle2 VALUES (1000000007), (1.2345), (0.0), (-1), (123456789012);
    
    SELECT LEN(Spalte), LEN(CONVERT(varchar(41), Spalte, 0)), CONVERT(varchar(41), Spalte, 0)
    FROM @tabelle2

    zeigt das Verhalten.

    Generell gilt: Zum Vergleichen von Zahlen ist die Zeichendarstellung in fast allen Fällen ungeeignet.

    Gruß Elmar


    Montag, 1. August 2011 09:48
    Beantworter
  • Andreas Vogt wrote:

    habe in einer Abfrage als Feld stehen: Select...., len(Alias.Feldname) As
    Laenge1

    der Ausdruck in Len ist eine als float deklarierte Zahl mit 10 stellen,
    z.B. 1000000007

    Ich bekomme als Ergebnis aber statt der 10 eine 6.

    Wenn ich statt dem Ausdruck direkt die Zahl schreibe bekomme ich die 10:

    len(1000000007) As Laenge2

    Hintergrund ist dass ich in einer SP Len() im Kriterium einsetzen möchte.

    Du solltest Deinen Hintergrund genauer erläutern. Was willst Du mit Len() als Kriterium prüfen?

    Wenn Du prüfen willst, welche Zahl grösser ist, vergleiche die Zahlen direkt.

    Wenn Du die Länge der Zeichen Repräsentation von Zahlen vergleichen willst, dann solltest Du diese in ein genortes Format überführen, bevor Du diese vergleichst. Ich denke

    LEN(CAST(CAST(Alias.Feldname AS NUMERIC(20, 0)) AS NVARCHAR(20)))

    könnte helfen, allerdings hat Elmar hier auch auf eine Unsicherheit hingewiesen, welche ich nicht kenne, vielleicht das Vorzeichen oder exponential Darstellungen.
    Falls in in Alias.Feldname auch Strings oder Datumswerte enthalten sein können, dann solltest Du auch bei diesen entsprechend reagieren, z.B. mit den Funktionen ISNUMERIC() oder ISDATE().

    Gruss
    Henry

    • Als Antwort markiert Andreas Vogt Dienstag, 2. August 2011 05:43
    Dienstag, 2. August 2011 04:28
  • Hallo Henry,

    ich möchte nur Datenimportieren wo der ID-Wert min. 9 Stellen hat.

    Datensätze mit weniger Stellen im ID-Feld sind ungültig.

    Das mit dem Casten ist ne gute Lösung, danke.

     

    Gruß Andreas


    http://www.AccessBlog.de
    Dienstag, 2. August 2011 05:43
  • Hallo Andreas

    Andreas Vogt wrote:

    ich möchte nur Datenimportieren wo der ID-Wert min. 9 Stellen hat.

    Datensätze mit weniger Stellen im ID-Feld sind ungültig.
    Das mit dem Casten ist ne gute Lösung, danke.

    Und das ist immer eine ganze Zahl? In diesem Fall wäre wohl ein Vergleich

    Alias.FeldName > 999999999

    eher angebracht und mindestens so wirkungsvoll, wie die Zahl zweimal zu casten.

    Gruss
    Henry

    Dienstag, 2. August 2011 05:56
  • Oh, manchmal sieht man die Wald vor lauter Bäumen nicht.

    Danke für die Eingabe.

    Gruß Andreas


    http://www.AccessBlog.de
    Dienstag, 2. August 2011 06:44