Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Frage zu Updatemit Cast-Funktion

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von hjshbg, 15 Oktober 2016.

  1. hjshbg

    hjshbg Neuer Benutzer

    Hallo an alle Experten.

    Ich habe folgendes Problem:

    Ich möchte ein Update in meiner Tabelle unter folgender Bedingung durchführen:

    Feld1 = decimal(8,2)
    Feld2 = varchar(255)
    Feld3 = int(10)
    in Feld2 stehen Textvariable in folgender Form: "3 %" , "0,3" , "38 %" , "38,0 %" sowie "0,385"
    Dieses Feld2 möchte ich in Decimal konvertieren und so aufbereiten das am Ende folgende Werte in Feld1 eingetragen werden: 3,00 , 30,00 , 38,00 , 38,00 sowie 38,50 .

    Testweise versuche ich ein update mit Feld2="0,3"

    update tab1 set feld1=cast(feld2 as decimal)*100 where feld3=2

    Leider ohne Erfolg. Die Konvertierung funktioniert so nicht und es wird immer das "AS" angemeckert.
    Was mache ich falsch?

    Bitte um Unterstützung.
    PS. Ich arbeite mit XAMPP Control Panel v3.2.2

    Vielen Dank im voraus.
    Mit freundlichen Grüßen
    hjshbg
     
  2. Aus 3 wird 3, aus 0,3 30, 38 bleiben 38 und aus 0,385 wird 38,5. Logisch. Darf ich nach deiner Mathe-Note fragen?
     
  3. hjshbg

    hjshbg Neuer Benutzer

    Hallo Akretschmer_mobile.

    Schön das Du Dich über mich lustig machst, aber vieleicht habe ich mich auch nicht ausführlich genug ausgedrückt.
    Die Daten im Feld2 stammen nicht von mir. Es sollten eigentlich Rabatt-Daten sein.
    Ich möchte nun diese Daten so aufbereiten, das sie für mich korekt und plausibel sind.
    Als Beispiel: aus einer Textvariablen "3 %" soll nun für mich ein dezimaler Wert von 3,00 im Feld1 stehen.
    Hierfür benötige ich nun die Konvertierung.
    Solltest Du für diesen Zweck eine Lösung parat haben, währe ich Dir sehr dankbar.

    Mit freundlichen Grüßen
    hjshbg
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Du hast:

    Code:
    test=*# \d hjshbg;
      Tabelle »public.hjshbg«
      Spalte  |  Typ  | Attribute
    ----------+---------+-----------
     id  | integer | not null
     val_text | text  |
     val_num  | numeric |
    Indexe:
      "hjshbg_pkey" PRIMARY KEY, btree (id)
    
    test=*# select * from hjshbg ;
     id | val_text | val_num
    ----+----------+---------
      1 | 3 %  |   
      2 | 0,3 %  |   
      3 | 38 %  |   
      4 | 38,0 %  |   
      5 | 0,385 %  |   
    (5 Zeilen)
    
    Und willst:

    Code:
    test=*# update hjshbg set val_num = regexp_replace(regexp_replace(val_text,',','.'),'[^.0-9]','','g')::numeric;
    UPDATE 5
    test=*# select * from hjshbg ;
     id | val_text | val_num
    ----+----------+---------
      1 | 3 %  |  3
      2 | 0,3 %  |  0.3
      3 | 38 %  |  38
      4 | 38,0 %  |  38.0
      5 | 0,385 %  |  0.385
    (5 Zeilen)
    
    Du solltest gleich richtige Datentypen verwenden. Du solltest das auch gleich beim Insert machen, z.B. via TRIGGER.

    Ach ja: MySQL kennt kein regexp_replace(), Du wirst also etwas basteln müssen.
     
  5. hjshbg

    hjshbg Neuer Benutzer

    Hallo Akretschmer_mobile.
    Erstmal besten Dank für die schnelle Antwort.
    Ich habe ein bißchen Zeit für die Analyse benötigt.

    Hier mein Ergebnis:

    update Tab1 set feld1= regexp_replace(regexp_replace(feld2,',','.'),'[^.0-9]','')

    Hiermit wurden alle Daten entsprechend meiner Vorstellung richtig umgewandelt, außer den Feldinhalten die mit '0,' anfangen. Diese Daten stammen aus Excel bezw. Access und waren als Prozentvariable deklariert.

    Mit einem zweiten Durchlauf:

    update Tab1 set feld1= regexp_replace(regexp_replace(feld2,',','.'),'[^.0-9]','')*100 where feld1 like ‚0.%‘

    habe ich auch diesen Fall glöst.
    Lieber wäre es mir gewesen dieses mit einem Statement zu erledigen:

    update Tab1 set feld1 = CASE
    when `feld2 like '0.%' then
    regexp_replace(regexp_replace(feld2,',','.'),'[^.0-9]','')*100
    ELSE
    regexp_replace(regexp_replace(feld2,',','.'),'[^.0-9]','')
    End

    Leider funktioniert es so nicht.

    Mit freundlichen Grüßen
    hjshbg
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden