Ergebnis 1 bis 9 von 9

Thema: Cast von String nach Integer

  1. #1
    karl_ha ist offline Erfahrener Benutzer
    Registriert seit
    08.03.2009
    Beiträge
    225

    Standard 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)
    Geändert von karl_ha (25.08.2010 um 15:19 Uhr)

  2. #2
    castorp ist offline Erfahrener Benutzer
    Registriert seit
    27.06.2009
    Beiträge
    493

    Standard

    Zitat Zitat von karl_ha Beitrag anzeigen
    Wie geht man am besten vor?
    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.
    A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

  3. #3
    karl_ha ist offline Erfahrener Benutzer
    Registriert seit
    08.03.2009
    Beiträge
    225

    Standard

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

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

  4. #4
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von karl_ha Beitrag anzeigen
    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.
    Gemischt? Ganz schlecht.

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

    Wie geht man am besten vor?
    Casten.

    Code:
    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
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  5. #5
    karl_ha ist offline Erfahrener Benutzer
    Registriert seit
    08.03.2009
    Beiträge
    225

    Standard

    select ha::int * 10 from karl;
    Welche Version von postgres?

    PHP-Code:
    FEHLER:  Syntaxfehler bei »:«
    LINE 1
    select ha:int 10 from karl 

  6. #6
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von karl_ha Beitrag anzeigen
    Welche Version von postgres?

    PHP-Code:
    FEHLER:  Syntaxfehler bei »:«
    LINE 1
    select ha:int 10 from karl 
    Bei mir stehen da 4 Punkte: 2 nebeneinander und 2 übereinander.

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  7. #7
    karl_ha ist offline Erfahrener Benutzer
    Registriert seit
    08.03.2009
    Beiträge
    225

    Standard

    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.

  8. #8
    karl_ha ist offline Erfahrener Benutzer
    Registriert seit
    08.03.2009
    Beiträge
    225

    Standard

    Die einfache Abfrage:
    PHP-Code:
    test=# SELECT * FROM karl;
         
    ha      id
    -------------+----
     
    123         |  1
     5363        
    |  2
     asd123123aa 
    |  3
    (3 Zeilen
    Mit cast und regex

    PHP-Code:

    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

  9. #9
    karl_ha ist offline Erfahrener Benutzer
    Registriert seit
    08.03.2009
    Beiträge
    225

    Standard

    Zitat Zitat von akretschmer Beitrag anzeigen
    Mit einem regex prüfen.
    Noch eine Frage dazu:

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

    Edit:

    Code:
    SELECT record FROM myrecords WHERE record ~ '[0-9]{4,}';
    Nette Seite: Using Regular Expressions in PostgreSQL - O'Reilly Media
    Geändert von karl_ha (25.08.2010 um 17:43 Uhr)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum