Cast von String nach Integer

Als ein Join nicht funktionierte habe ich bemerkt, dass eine Spalte als Text erstellt worden war.

In der Spalte sind Integer, Strings aber auch Datums-Werte als Text eingetragen.

Für den Join benötige ich die Integer-Werte in dieser Spalte.

Wie geht man am besten vor?

  • Neue Spalte als Integer erstellen
  • Mit einem Cast alle Integer-Werte umwandeln
  • Mit einem Trigger alle neuen Textwerte überprüfen

Frage:

  • Wie überprüft man einen Textwert, ob dieser nur aus Integer-Werten besteht? (Länge ist immer gleich, bzw. die Werte stehen ja auch in einer anderen Tabelle zum Join bereit)

Du musst dein DB-Model überarbeiten/überdenken.

Wie überprüft man einen Textwert, ob dieser nur aus Integer-Werten besteht? (Länge ist immer gleich)

Wenn Du Dein fehlerhaftes DB-Design behalten musst/willst dann würde ich das mit einer regular expression machen.

Du musst dein DB-Model überarbeiten/überdenken.

Die Daten kommen (leider) nicht von mir. Dachte, ich seh nicht richtig…

Gemischt? Ganz schlecht.

Für den Join benötige ich die Integer-Werte in dieser Spalte.

Wie geht man am besten vor?

Casten.

test=*# create table karl (ha text);
CREATE TABLE
test=*# insert into karl values ('123');
INSERT 0 1
test=*# select ha::int * 10 from karl;
 ?column?
----------
     1230
(1 row)



  • Neue Spalte als Integer erstellen
  • Mit einem Cast alle Integer-Werte umwandeln
  • Mit einem Trigger alle neuen Textwerte überprüfen

Gleich richtig machen?

Frage:

  • Wie überprüft man einen Textwert, ob dieser nur aus Integer-Werten besteht? (Länge ist immer gleich, bzw. die Werte stehen ja auch in einer anderen Tabelle zum Join bereit)

Mit einem regex prüfen.

Andreas

select ha::int * 10 from karl;

Welche Version von postgres?

FEHLER:  Syntaxfehler bei »:«
LINE 1: select ha:int * 10 from karl

Bei mir stehen da 4 Punkte: 2 nebeneinander und 2 übereinander.

Andreas

Liegt am EMS SQL-Manager.

Über die Konsole geht es.

Bei mir stehen da 4 Punkte: 2 nebeneinander und 2 übereinander.

Was war nur die Fehlermeldung. Im Querry sind es 4 Punkte.

Die einfache Abfrage:

test=# SELECT * FROM karl;
     ha      | id
-------------+----
 123         |  1
 5363        |  2
 asd123123aa |  3
(3 Zeilen) 

Mit cast und regex

test=# SELECT (regexp_matches(ha, E'[0-9._%-]+'))[1]::int AS test FROM karl WHERE ha ~ E'[0-9._%-]+';
  test
--------
    123
   5363
 123123
(3 Zeilen)
 

cheers

Noch eine Frage dazu:

Wie sagt man, wenn der Wert genau 10 Zeichen haben muss.

Edit:

SELECT record FROM myrecords WHERE record ~ '[0-9]{4,}';

Nette Seite: Using Regular Expressions in PostgreSQL - O’Reilly Media

SELECT record FROM myrecords WHERE record ~ '[0-9]{4,}';

Nette Seite: Using Regular Expressions in PostgreSQL - O’Reilly Media