Benutzer mit den meisten Antworten
Len() liefert unterschiedliche Ergebnisse

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
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
-
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- Als Antwort markiert Elmar BoyeEditor Dienstag, 2. August 2011 07:42
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
-
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
-
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- Als Antwort markiert Elmar BoyeEditor Dienstag, 2. August 2011 07:42