Ankündigung

Einklappen
Keine Ankündigung bisher.

postgres update case where

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • postgres update case where

    Hallo,

    habe hier ein kleines Problem mit einem Update Befehl für postgres:

    Code:
    UPDATE table SET A =
    CASE
    WHEN B LIKE '%X%' THEN 'x'
    WHEN B LIKE '%Y%' THEN 'y'
    ELSE NULL END
    WHERE A = ''
    Spalte A soll über case befüllt werden (sobald ein case zutrifft, sollen die anderen case dieses einen Updates ignoriert werden...ist aktuell auch der Fall), wenn nichts in A steht. Leider ignoriert Postgres mein Update und schreibt nichts.

    Hintergund: Es folgen mehrere Updates hintereinander und das nächste Update soll nur in A schreiben, wenn vorher noch nichts eingetragen wurde. Was mache ich falsch?


  • #2
    Du solltest dein Problem etwas konkreter formulieren.

    Woher weisst du, dass nur der erste Case greift, wenn das Update gar nicht ausgeführt wird?
    GitHub.com - ChrisAndChris - RowMapper und QueryBuilder für MySQL-Datenbanken

    Kommentar


    • #3
      Zitat von knuffiwuffi Beitrag anzeigen
      Hallo,

      habe hier ein kleines Problem mit einem Update Befehl für postgres:

      Code:
      UPDATE table SET A =
      CASE
      WHEN B LIKE '%X%' THEN 'x'
      WHEN B LIKE '%Y%' THEN 'y'
      ELSE NULL END
      WHERE A = ''
      Spalte A soll über case befüllt werden (sobald ein case zutrifft, sollen die anderen case dieses einen Updates ignoriert werden...ist aktuell auch der Fall), wenn nichts in A steht. Leider ignoriert Postgres mein Update und schreibt nichts.

      Hintergund: Es folgen mehrere Updates hintereinander und das nächste Update soll nur in A schreiben, wenn vorher noch nichts eingetragen wurde. Was mache ich falsch?
      Bist Du sicher, daß der Vergleich mit '' korrekt ist, oder wäre eher ein IS NULL angeraten?

      Code:
      test=# select * from foo;
       id | col1 | col2
      ----+------+------
        1 | bla  |
        2 | bubb |
        3 |      |
      (3 rows)
      
      Time: 0,191 ms
      test=*# update foo set col2 = case when col1='bla' then 'hier bla' when col1 = 'bubb' then 'hier bubb' end where col2 is null;
      UPDATE 3
      Time: 0,277 ms
      test=*# select * from foo;
       id | col1 |   col2
      ----+------+-----------
        1 | bla  | hier bla
        2 | bubb | hier bubb
        3 |      |
      (3 rows)
      Davon abgesehen ist die Idee natürlich Müll, weil die eine Spalte aus der anderen berechenbar ist -> Redundanz.
      PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

      Kommentar


      • #4
        @ChristianK
        bei 5 einzelnen Updates läuft er durch bis zum letzten und trägt dann nur das letzte ein.

        Die Lösung:

        Code:
        WHERE col IS NULL
        Damit wären wir bei dem kleinen aber feinen Unterschied zwischen

        Code:
        WHERE col IS NULL
        
        WHERE col = 0
        
        WHERE col = ''
        1. NULL bedeutet ja nix
        2. 0 würde bedeutet es ist ein Wert vorhanden, dieser ist = 0
        3. '' würde bedeutet es ist ein Wert vorhanden, dieser ist = ''

        Wenn postgres einen table erzeugt, dann ist am Anfang NULL enthalten. Sobald die Zelle beschrieben wurde, auch wenn '' (also leer) beschrieben wurde, dann ist die Zelle nicht mehr NULL. Aber wieso kann postgres die Zelle nicht auf WHERE col = '' prüfen (ggf. weil diese am Anfang, wie erklärt, als NULL deklariert ist)?

        Anyhow, danke...es funktioniert

        Kommentar


        • #5
          In dem Sinne würde ich sagen, PG erzeugt keine Tabellen, sondern du. Und du kennst scheinbar den Unterschied zwischen NOT NULL und NULL nicht, was Spalten anbelangt.

          Wenn du leeren Inhalt mit NULL gleichsetzt, hast du - meiner Meinung - inkonsistente Daten in deiner Datenbank. Die beiden Dinge bedeuten nicht dasselbe.
          GitHub.com - ChrisAndChris - RowMapper und QueryBuilder für MySQL-Datenbanken

          Kommentar


          • #6
            Irgendwie ja und irgendwie nein.

            Ich verstehe schon, daß NULL nichts bedeutet und = '' bedeutet es ist etwas vorhanden aber der Inhalt ist leer.

            Was passiert denn eigentlich, wenn ich mit CREATE table ein NOT NULL an eine Spalte hänge? Wird diese dann automatisch mit einem leeren Inhalt gefüllt, sie ist dann nicht mehr NULL sonder = ''?

            Ich verstehe die Vor- und Nachteile von NOT NULL beim erstellen von Datenbanken anscheinend nicht so richtig.

            Kommentar


            • #7
              Wenn eine Spalte NOT NULL ist, dann muss ihr bei einem INSERT oder UPDATE einen Wert zugewiesen werden, der ungleich NULL ist.

              NOT NULL wird allgemein als nicht definiert oder nicht erfasst übersetzt.
              GitHub.com - ChrisAndChris - RowMapper und QueryBuilder für MySQL-Datenbanken

              Kommentar


              • #8
                so habe ich mir das gedacht, danke für die kurze erläuterung

                Kommentar


                • #9
                  Zitat von knuffiwuffi Beitrag anzeigen
                  Irgendwie ja und irgendwie nein.

                  Ich verstehe schon, daß NULL nichts bedeutet und = '' bedeutet es ist etwas vorhanden aber der Inhalt ist leer.

                  Was passiert denn eigentlich, wenn ich mit CREATE table ein NOT NULL an eine Spalte hänge? Wird diese dann automatisch mit einem leeren Inhalt gefüllt, sie ist dann nicht mehr NULL sonder = ''?

                  Ich verstehe die Vor- und Nachteile von NOT NULL beim erstellen von Datenbanken anscheinend nicht so richtig.

                  NULL und '' sind zwei grundlegend verschiedene Dinge. NULL kann z.B. nicht mit etwas verglichen werden, auch nicht mit sich selbst:

                  Code:
                  test=# select NULL = NULL;
                   ?column?
                  ----------
                  
                  (1 row)
                  Das Resultat ist weder wahr noch falsch - es ist NULL.

                  Wenn eine Spalte NOT NULL ist, dann ist ZWINGEND etwas einzugeben:

                  Code:
                  test=# create table foo (i int primary key, x int not null);
                  CREATE TABLE
                  test=*# insert into foo values (1, null);
                  ERROR:  null value in column "x" violates not-null constraint
                  DETAIL:  Failing row contains (1, null).
                  STATEMENT:  insert into foo values (1, null);
                  ERROR:  null value in column "x" violates not-null constraint
                  DETAIL:  Failing row contains (1, null).
                  PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                  Kommentar


                  • #10
                    @akretschmer

                    Danke für den Nachtrag...es ist schon eine Denksportaufgabe für jemanden, der nicht jeden Tag mit IT-Themen verbunden ist...NULL und 0 auszulegen...0 ist eine Rückgabe, und zwar Ergebnis 0 (ja, es ist was vorhanden, aber die Antwort ist nichts)...NULL hingegen ist nichts...du stellst jemanden eine Frage und es kommt keine Antwort.

                    Kleiner Unterschied, große Wirkung...wie in meinem Bspl. gesehen (geht jetzt, dank akretschmar...dem postgres king). Ich danke euch für die Unterstützung...

                    Nachtrag:
                    Eigentlich sollte 0 ja nichts sein, in der IT scheint es aber als Rückgabe eines Ergebnisses gewertet zu werden. Ich frage mich, wer der Urheber dieses Denkens ist. Rein zufällig oder hat jemand gesagt wir müssen für Rechenoperationen zwingend NULL einführen um eindeutige Ergebnisse zu schaffen?! Zu den kreativsten Menschen scheinen echt Programmierer zu zählen.

                    Oha...habe grad auf Wikipedia gelesen "ein Nullwert ist aber gleichzeitig ein Wert." Wird NULL in der IT unterschiedlich interpretiert?

                    Kommentar


                    • #11
                      Zitat von knuffiwuffi Beitrag anzeigen
                      [...] (1) NULL und 0 auszulegen...0 ist eine Rückgabe, und zwar Ergebnis 0 (ja, es ist was vorhanden, aber die Antwort ist nichts)...NULL hingegen ist nichts...du stellst jemanden eine Frage und es kommt keine Antwort.

                      [...]
                      Nachtrag:
                      (2) Eigentlich sollte 0 ja nichts sein, in der IT scheint es aber als Rückgabe eines Ergebnisses gewertet zu werden. Ich frage mich, wer der Urheber dieses Denkens ist. Rein zufällig oder hat jemand gesagt wir müssen für Rechenoperationen zwingend NULL einführen um eindeutige Ergebnisse zu schaffen?! Zu den kreativsten Menschen scheinen echt Programmierer zu zählen.
                      [...]
                      Zu (1): Hier liegst du bereits das erste Mal falsch. 0 ist nicht nichts. 0 ist 0, und zwar genau 0. Die Zahl 0 ist eine Zahl, deren Betrag 0 ist. Nichts wäre das [ende des nichts]. Wenn du 0 Autos produziert hast, hast du eine exakte Anzahl Autos produziert (nämlich keine). Du hast eine Information. Wenn du NULL Autos produziert hast, hast du keine Ahnung, wie viele Autos du produziert hast.

                      Zitat von Wikipedia
                      [Null bezeichnet] die Abwesenheit eines Wertes, weil keiner existiert
                      GitHub.com - ChrisAndChris - RowMapper und QueryBuilder für MySQL-Datenbanken

                      Kommentar


                      • #12
                        Zitat von knuffiwuffi Beitrag anzeigen

                        Nachtrag:
                        Eigentlich sollte 0 ja nichts sein, in der IT scheint es aber als Rückgabe eines Ergebnisses gewertet zu werden. Ich frage mich, wer der Urheber dieses Denkens ist. Rein zufällig oder hat jemand gesagt wir müssen für Rechenoperationen zwingend NULL einführen um eindeutige Ergebnisse zu schaffen?! Zu den kreativsten Menschen scheinen echt Programmierer zu zählen.

                        Du hast 2 Meßpunkte für Temperatur, also Thermometer. Am ersten hast Du bei 3 Messungen 6,0 und 0 Grad gemessen. Am zweiten ist Dir nach der ersten Messung mit 9 Grad das Thermometer kapott gegangen. Berechne von beiden Meßpunkten den Durchschnitt.

                        Code:
                        test=*# select * from messung;
                         nr | punkt1 | punkt2
                        ----+--------+--------
                          1 |      6 |      9
                          2 |      0 |
                          3 |      0 |
                        (3 rows)
                        
                        Time: 0,323 ms
                        test=*# select * from messung union select null, avg(punkt1), avg(punkt2) from messung ;
                         nr | punkt1 | punkt2
                        ----+--------+--------
                          1 |      6 |      9
                          2 |      0 |
                          3 |      0 |
                            |      2 |      9
                        (4 rows)
                        Was hast Du erwartet?
                        PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                        Kommentar


                        • #13
                          Angenommen ich erstelle einen neuen Table ohne Einträge, was ist dann in diesen Zellen...

                          Ein string der Länge 0, also = ""
                          Oder nichts, also IS NULL

                          Nun wird die Zelle beschrieben und der Inhalt kurz danach wieder gelöscht, wie sieht es dann aus?

                          Die Frage ziehlt also mehr in Richtugn "was macht die Datenbank". Werden beim löschen intern nur flags umgeschrieben und eine permanente Löschung geht nur über NULL?

                          Kommentar


                          • #14
                            Zitat von knuffiwuffi Beitrag anzeigen
                            Angenommen ich erstelle einen neuen Table ohne Einträge, was ist dann in diesen Zellen...
                            Eine Tabelle ohne Einträge hat keine (sichtbaren) Zeilen.
                            PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                            Kommentar


                            • #15
                              Richtig, muss anders formulieren:

                              eine Tabelle mit 3 rows und 3 columns, Column Nr. 3 bekommt aber keinen Wert.

                              Und nun wie oben beschrieben bezogen auf Column 3

                              Kommentar

                              Lädt...
                              X