6 Stimmen

Umwandlung von varchar in numerisch in Informix

Ich habe ein Problem bei der Konvertierung des Typs varchar in den Typ Int in Informix. Eigentlich weiß ich nicht, ob der Wert, den ich in INT konvertieren möchte, wirklich varchar ist oder nicht. Es handelt sich um ein Sandbox-System.

Als Beispiel: Ich versuche, diese Art von

Select telnumber from numbers n
 where Cast(n.telnumber AS INT) between 1234 and 9999

Ich habe diesen Fehler: "Fehler bei der Umwandlung von Zeichen in Zahlen"

Wenn ich diese Abfrage wie folgt ausführe:

Select telnumber from numbers n where n.telnumber between '1234' and '9999'

bringt eine Ergebnismenge, aber nicht in dem Bereich, den ich definiert habe.

130987
130710
130723

Wie kann ich telnumber in einen numerischen Wert umwandeln und ihn im Bereich "zwischen" 1234 und 9999 verwenden?

2voto

Jonathan Leffler Punkte 694013

Der Konvertierungsfehler deutet darauf hin, dass einige der Werte in der Telnummernspalte nicht als gültige Ganzzahl formatiert sind - und daher den Fehler auslösen, den Sie sehen, wenn die Konvertierung versucht wird.

Die zweite Abfrage listet die zusätzlichen Werte auf, da "123" beim Vergleich als Zeichenkette zwischen "10" und "20" liegt.

Wenn Sie sich auf 4-stellige Zahlen beschränken wollen, können Sie diese verwenden:

SELECT telnumber
  FROM numbers n
 WHERE n.telnumber BETWEEN '1234' AND '9999'
   AND LENGTH(n.telnumber) = 4

Dies würde immer noch "1AA2" in der Ergebnismenge enthalten.

Die vollständige Unterstützung regulärer Ausdrücke (wie PCRE) ist in IDS leider nicht standardmäßig vorhanden. Mit dem nicht standardmäßigen MATCHES-Operator wäre dies jedoch möglich:

SELECT telnumber
  FROM numbers n
 WHERE n.telnumber BETWEEN '1234' AND '9999'
   AND LENGTH(n.telnumber) = 4
   AND n.telnumber MATCHES '[0-9][0-9][0-9][0-9]'

Das ist ein einfacher regulärer Ausdruck - aber der "*" ist ein Shell-Globbing-Stil "jede Folge von null oder mehr Zeichen" und nicht der Kleene Star "null oder mehr Wiederholungen des vorherigen Zeichens".

2voto

sanmiguel Punkte 4320

Einfache Antwort: Informix hat ein eingebautes Casting, das Sie wie folgt verwenden können:

SELECT telnumber
FROM   numbers n
WHERE  n.telnumber::integer BETWEEN 1234 AND 9999;

Weiter:

Wie Jonathan Leffler jedoch bereits erwähnt hat, enthält Ihr Datensatz Werte, die nicht unbedingt in Ganzzahlen umgewandelt werden können. Wenn das so ist, dann ist dies vielleicht nicht das ideale Schema für Ihre Zwecke? Wenn Sie unbedingt nicht-numerische Zeichen benötigen (ich vermute z. B., dass Sie am Ende eines der Zeichen '-', '(' oder ')' haben werden), könnten Sie versuchen, Zeilen auszuschließen, die nicht-numerischen Zeichen entsprechen:

SELECT telnumber
FROM   numbers n
WHERE  n.telnumber not matches "*[0-9]*"
AND    n.telnumber::integer BETWEEN 1234 AND 9999;

Alternativ könnten Sie vielleicht versuchen, eine gespeicherte Prozedur mit einem ON EXCEPTION-Block zu verwenden. (Fehler bei der Umwandlung von Zeichen in Zahlen ist errno 1213).

Weitere Informationen zur Verwendung von 'ON EXCEPTION': http://publib.boulder.ibm.com/infocenter/idshelp/v10/index.jsp?topic=/com.ibm.sqls.doc/sqls946.htm

Weitere Informationen zur Definition und Verwendung von gespeicherten Prozeduren: http://publib.boulder.ibm.com/infocenter/idshelp/v10/index.jsp?topic=/com.ibm.sqls.doc/sqls906.htm

0voto

Dour High Arch Punkte 21088

Ich verwende Informix nicht, aber das funktioniert bei mir mit SQL Server:

SELECT telnumber FROM numbers WHERE Abs(n.telnumber) BETWEEN 1234 AND 9999

Sie werden jedoch wahrscheinlich auf Probleme stoßen, da Telefonnummern in Wirklichkeit Zeichenketten und keine INTs sind, und letztlich wird jeder Versuch, sie als INTs zu behandeln, fehlschlagen.

0voto

MrCO Punkte 1

Bei mir hat das funktioniert:

Select *
From table1
where cast(left(field1,7) as numeric) BETWEEN 2128042 and 2128045

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X