In PostgreSQL habe ich eine Tabelle mit einer varchar-Spalte. Die Daten sollen Ganzzahlen sein und ich brauche sie in einer Abfrage als Ganzzahl. Einige Werte sind leere Zeichenfolgen. Folgende:
SELECT myfield::integer FROM mytable
ergibt ERROR: invalid input syntax for integer: ""
Wie kann ich eine Besetzung abfragen und im Fehlerfall während der Besetzung in postgres 0 haben?
quelle
E'\\d{1,5}$'
.{1,5}
oben angegebene Limit von @ Bobort für die Ziffern ist möglicherweise eine gute Idee, wenn Sie sich Gedanken über einen Überlauf machen. Es maskiert jedoch größere Zahlen, was beim Konvertieren einer Tabelle zu Problemen führen kann. Persönlich möchte ich lieber den Abfragefehler im Voraus haben und wissen, dass einige meiner "Ganzzahlen" verrückt sind (Sie können auch zuerst auswählenE'\\d{6,}$'
, um sicherzugehen).Sie können auch Ihre eigene Konvertierungsfunktion erstellen, innerhalb derer Sie können Ausnahmeblöcke verwenden:
Testen:
quelle
INSERT
Aussage?Ich hatte das gleiche Bedürfnis und fand, dass dies für mich gut funktioniert (postgres 8.4):
Einige Testfälle zur Demonstration:
Wenn Sie die Möglichkeit behandeln müssen, dass das Feld nicht numerischen Text enthält (z. B. "100bad"), können Sie mit regexp_replace nicht numerische Zeichen vor der Umwandlung entfernen.
Dann geben Text- / Varchar-Werte wie "b3ad5" auch Zahlen an
Um Chris Cogdons Besorgnis über die Lösung anzusprechen, die nicht für alle Fälle 0 ergibt, einschließlich eines Falls wie "schlecht" (überhaupt keine Ziffern), habe ich diese angepasste Aussage gemacht:
Es funktioniert ähnlich wie die einfacheren Lösungen, außer dass 0 angegeben wird, wenn der zu konvertierende Wert nur aus nichtstelligen Zeichen besteht, z. B. "schlecht":
quelle
Dies mag ein Hack sein, aber in unserem Fall hat es die Arbeit erledigt:
Erklärung (getestet auf Postgres 8.4):
Der oben erwähnte Ausdruck ergibt
NULL
für NULL-Werte inmyfield
und0
für leere Zeichenfolgen (Dieses genaue Verhalten kann zu Ihrem Anwendungsfall passen oder nicht).Testdaten:
Die Abfrage ergibt das folgende Ergebnis:
Während nur
values::integer
die Auswahl eine Fehlermeldung ergibt.Hoffe das hilft.
quelle
SELECT CASE WHEN myfield="" THEN 0 ELSE myfield::integer END FROM mytable
Ich habe noch nie mit PostgreSQL gearbeitet, aber ich habe das Handbuch auf die korrekte Syntax von IF-Anweisungen in SELECT-Abfragen überprüft .
quelle
@ Matthews Antwort ist gut. Aber es kann einfacher und schneller sein. In der Frage wird gefragt, ob leere Zeichenfolgen (
''
) in0
andere "ungültige Eingabesyntax" oder "außerhalb des Bereichs" eingegeben werden sollen:Dies gibt
0
für eine leere Zeichenfolge undNULL
für jede andere ungültige Eingabe zurück.Es kann leicht für jede Datentypkonvertierung angepasst werden .
Das Eingeben eines Ausnahmeblocks ist wesentlich teurer. Wenn leere Zeichenfolgen häufig vorkommen, ist es sinnvoll, diesen Fall zu erfassen, bevor eine Ausnahme ausgelöst wird.
Wenn leere Zeichenfolgen sehr selten sind, lohnt es sich, den Test in die Ausnahmeklausel zu verschieben.
quelle
Diese Funktion wird immer zurückgegeben,
0
wenn die Eingabezeichenfolge keine Ziffern enthält.SELECT parse_int('test12_3test');
wird zurückkehren
123
quelle
Ich fand den folgenden Code einfach und funktionierend. Die ursprüngliche Antwort finden Sie hier https://www.postgresql.org/message-id/[email protected]
ich hoffe es hilft
quelle
SUBSTRING kann in einigen Fällen hilfreich sein. Sie können die Größe des int begrenzen.
quelle
Wenn die Daten Ganzzahlen sein sollen und Sie diese Werte nur als Ganzzahlen benötigen, warum gehen Sie nicht die ganze Meile und konvertieren die Spalte in eine Ganzzahlspalte?
Dann können Sie diese Konvertierung von unzulässigen Werten in Nullen nur einmal an der Stelle des Systems durchführen, an der die Daten in die Tabelle eingefügt werden.
Mit der obigen Konvertierung zwingen Sie Postgres, diese Werte für jede einzelne Zeile in jeder Abfrage für diese Tabelle immer wieder zu konvertieren. Dies kann die Leistung erheblich beeinträchtigen, wenn Sie viele Abfragen für diese Spalte in dieser Tabelle durchführen.
quelle
Die folgende Funktion funktioniert
error_result
) für nicht umsetzbare Ergebnisse, z. B.abc
oder999999999999999999999999999999999999999999
null
wienull
bigints
werden verglichen,lower_bound
um beispielsweise nur positive Werte zu erzwingenquelle
Ich habe auch das gleiche Bedürfnis, aber das funktioniert mit JPA 2.0 und Hibernate 5.0.2:
Wirkt Wunder. Ich denke, es funktioniert auch mit LIKE.
quelle
Dies sollte auch die Arbeit erledigen, aber dies ist über SQL und nicht postgres-spezifisch.
quelle