Ankündigung

Einklappen
Keine Ankündigung bisher.

mysql zeigt die Daten nicht richtig

Einklappen

Neue Werbung 2019

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

  • mysql zeigt die Daten nicht richtig

    Hallo Forum
    Ich arbeite mit mysql. Leider funktioniert ein relativ einfacher SQL nicht und ich sehe den Fehler nicht.
    im nachfolgenden Beispiel zähle ich die Buchstaben und versuche in der Ausgabe im Feld Nachname die entsprechenden Daten anzuzeigen.
    Leider zeigt er nur die Daten im Feld Nachname welche im Datensatz beides Nachname und Firmenname enthalten
    HTML-Code:
    SELECT a.IDAdr,
    if(CHAR_LENGTH(b.Firmenname)=0,
    if(CHAR_LENGTH(b.Nachname)=0, "ohne Name", b.Nachname), if(CHAR_LENGTH(b.Nachname)=0, b.Firmenname, concat(b.Firmenname," ",b.Nachname))) as Nachname,
    b.Vorname,
    if(CHAR_LENGTH(c.Geburt)>0,DATE_FORMAT(c.Geburt, '%m.%d.%Y'),"") as geb
    FROM `TLastAdr` a
    LEFT JOIN TAdressen b ON a.IDAdr=b.Ad_id
    LEFT JOIN TKunde c ON b.Ad_id=c.Ad_id
    Versuch 2 mit Case
    HTML-Code:
    SELECT a.IDAdr,
           CASE WHEN b.Firmenname = ''
                THEN CASE WHEN b.Nachname = ''
                          THEN "ohne Name"
                          ELSE b.Nachname
                     END
                ELSE CASE WHEN b.Nachname = ''
                          THEN b.Firmenname
                          ELSE CONCAT(b.Firmenname," + ",b.Nachname)
                     END
           END as Nachname,
           b.Vorname,
           CASE WHEN c.Geburt <> ''
                THEN DATE_FORMAT(c.Geburt, '%m.%d.%Y')
                ELSE "kein Gebutstag"
           END as geb
    FROM `TLastAdr` a
    LEFT JOIN TAdressen b ON a.IDAdr=b.Ad_id
    LEFT JOIN TKunde c ON b.Ad_id=c.Ad_id
    Auch dieser SQL zeigt ein identisches Resultat.

    Wenn der Nachname oder der Firmanname fehlt ist das Feld Nachanme leer und ich sehe und verstehe nicht warum.
    Sieht jemand den Fehler?


  • #2
    ein leerer String ist nicht dasselbe wie NULL.

    Code:
     ?column?
    ----------
     foobar
    (1 row)
    
    test=*# select 'foo' || '';
     ?column?
    ----------
     foo
    (1 row)
    
    test=*# select 'foo' || NULL;
     ?column?
    ----------
    
    (1 row)
    
    test=*#

    Wenn Deine Spalten NULL-Werte enthalten können, kannst Du mit coalesce() arbeiten:

    Code:
    test=*# select 'foo' || coalesce(NULL,'');
     ?column?
    ----------
     foo
    (1 row)
    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

    Kommentar


    • #3
      Bei Datenbankproblemen bitte immer das Create Statement zu den Tabellen mitliefern, damit man sich die Struktur ansehen kann und es besser nachzuvollziehen ist.

      akretschmer

      Mysql scheint da andere Ergebnisse zu liefern.
      Code:
      mysql> select 'foo' || '';
      +-------------+
      | 'foo' || '' |
      +-------------+
      |           0 |
      +-------------+
      1 row in set, 1 warning (0,04 sec)
      
      mysql> SELECT 'foo' || NULL;
      +---------------+
      | 'foo' || NULL |
      +---------------+
      |          NULL |
      +---------------+
      1 row in set, 1 warning (0,02 sec)

      Kommentar


      • #4
        In Mysql ist das ein logisches or, in anderen Datenbank ist das eine Stringverkettung. Das Äquivalent in Mysql ist CONCAT('foo', '...', '...').

        Kommentar


        • #5
          Zitat von Marlon Beitrag anzeigen
          Ich arbeite mit mysql.
          Ich denke mehr muss dazu nicht gesagt werden.

          Kommentar


          • #6
            Zitat von protestix Beitrag anzeigen
            Bei Datenbankproblemen bitte immer das Create Statement zu den Tabellen mitliefern, damit man sich die Struktur ansehen kann und es besser nachzuvollziehen ist.

            akretschmer

            Mysql scheint da andere Ergebnisse zu liefern.
            Code:
            mysql> select 'foo' || '';
            +-------------+
            | 'foo' || '' |
            +-------------+
            | 0 |
            +-------------+
            1 row in set, 1 warning (0,04 sec)
            
            mysql> SELECT 'foo' || NULL;
            +---------------+
            | 'foo' || NULL |
            +---------------+
            | NULL |
            +---------------+
            1 row in set, 1 warning (0,02 sec)
            nein, das passt schon.

            Code:
            test=# select 'foo' || null;
             ?column?
            ----------
            
            (1 row)
            
            test=*# \pset null 'NULL'
            Null display is "NULL".
            test=*# select 'foo' || null;
             ?column?
            ----------
             NULL
            (1 row)
            
            test=*#
            PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

            Kommentar


            • #7
              Zitat von protestix Beitrag anzeigen
              Ich denke mehr muss dazu nicht gesagt werden.
              ACK. Mitleid gibt es dafür nicht.
              PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

              Kommentar


              • #8
                Besten Dank für all eure Antworten und Arbeit.
                Hier noch das Resultat welches mit beiden SQL's zurückgegeben wird

                Tabelle 1 die die Verwedeten Adressen Indexe enthält
                HTML-Code:
                CREATE TABLE `TLastAdr` (
                    `IDAdr` INT(11) NOT NULL,
                    INDEX `IDAdr` (`IDAdr`) USING BTREE
                )
                COLLATE='utf8_general_ci'
                ENGINE=InnoDB
                Tabelle 2 mit den angaben zur Person
                HTML-Code:
                CREATE TABLE `TAdressen` (
                    `Ad_id` INT(11) NOT NULL AUTO_INCREMENT,
                    `HauptId` INT(11) NULL,
                    `Geschlecht` INT(11) NULL DEFAULT '0',
                    `Vorname` VARCHAR(50) NULL COLLATE 'utf8_general_ci',
                    `Nachname` VARCHAR(50) NULL COLLATE 'utf8_general_ci',
                    `Titel` VARCHAR(50) NULL COLLATE 'utf8_general_ci',
                    `Firmenname` VARCHAR(80) NULL COLLATE 'utf8_general_ci',
                    `Adresse` VARCHAR(255) NULL COLLATE 'utf8_general_ci',
                    `Ort` VARCHAR(50) NULL COLLATE 'utf8_general_ci',
                    `Postleitzahl` VARCHAR(20) NULL COLLATE 'utf8_general_ci',
                    `Land` VARCHAR(50) NULL COLLATE 'utf8_general_ci',
                    `Foto` LONGBLOB NULL,
                    `Frei1` VARCHAR(50) NULL COLLATE 'utf8_general_ci',
                    `Frei2` VARCHAR(50) NULL COLLATE 'utf8_general_ci',
                    `KundeJaNein` TINYINT(1) NULL,
                    `HatNebenAdr` TINYINT(1) NULL,
                    `Anschrift` LONGTEXT NULL COLLATE 'utf8_general_ci',
                    `Intern` TINYINT(1) NULL,
                    `Absender` TINYINT(1) NULL,
                    `Sperrung` INT(11) NULL,
                    `Gruppe` INT(11) NULL,
                    `IMPDate` DATETIME NULL,
                    `Postfach` VARCHAR(50) NULL COLLATE 'utf8_general_ci',
                    `QuikSuche` TINYINT(1) NULL,
                    `Frei3` VARCHAR(50) NULL COLLATE 'utf8_general_ci',
                    `Frei4` VARCHAR(50) NULL COLLATE 'utf8_general_ci',
                    `OLGeaendert` DATETIME NULL,
                    `ACCGeaendert` DATETIME NULL,
                    `OLEntryID` VARCHAR(50) NULL COLLATE 'utf8_general_ci',
                    `warn` INT(11) NULL,
                    `Provision` INT(11) NULL,
                    `gewaehlt` INT(11) NULL DEFAULT '0',
                    `aktiv` INT(11) NOT NULL DEFAULT '1',
                    `iskasse` INT(11) NOT NULL DEFAULT '0',
                    INDEX `Ad_id` (`Ad_id`) USING BTREE
                )
                COLLATE='utf8_general_ci'
                ENGINE=InnoDB
                AUTO_INCREMENT=17102
                Die letzte Tabele mit Geburtstag
                HTML-Code:
                CREATE TABLE `TKunde` (
                    `Kunden_id` INT(11) NOT NULL AUTO_INCREMENT,
                    `Ad_id` INT(11) NULL,
                    `KundenNr` VARCHAR(50) NULL COLLATE 'utf8_general_ci',
                    `Geburt` DATETIME NULL,
                    `Eintritt` DATETIME NULL,
                    `Austritt` DATETIME NULL,
                    `Rechtsform` INT(11) NULL,
                    `Gruendung` DATETIME NULL,
                    `MwstNr` INT(11) NULL,
                    `MWST_Steuersatz` VARCHAR(5) NULL COLLATE 'utf8_general_ci',
                    `MWST_Plicht` DATETIME NULL,
                    `MWST_Abrechnungsform` INT(11) NULL,
                    `AbrForm` VARCHAR(50) NULL COLLATE 'utf8_general_ci',
                    `AbrPeriode` VARCHAR(50) NULL COLLATE 'utf8_general_ci',
                    `RevStelle` VARCHAR(50) NULL COLLATE 'utf8_general_ci',
                    `Laufzeit` INT(11) NULL,
                    `Clarina` TINYINT(1) NULL,
                    `Frei1` VARCHAR(50) NULL COLLATE 'utf8_general_ci',
                    `Frei2` VARCHAR(50) NULL COLLATE 'utf8_general_ci',
                    `Frei3` VARCHAR(50) NULL COLLATE 'utf8_general_ci',
                    `Frei4` VARCHAR(50) NULL COLLATE 'utf8_general_ci',
                    `Frei5` LONGTEXT NULL COLLATE 'utf8_general_ci',
                    `Test` TINYINT(1) NULL,
                    INDEX `Kunden_id` (`Kunden_id`) USING BTREE
                )
                COLLATE='utf8_general_ci'
                ENGINE=InnoDB
                AUTO_INCREMENT=16244
                Resultat ohne Concat
                ohne_concat.png
                Mit Concat
                mit_concat.png

                Eigentlich dürfte kein Nachname leer sein!
                Besten Dank dass ihr das nochmals anschaut.

                Kommentar


                • #9
                  Zitat von Marlon Beitrag anzeigen
                  Besten Dank dass ihr das nochmals anschaut.
                  Warum? Ist doch alles gesagt.
                  PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                  Kommentar


                  • #10
                    Wenn eine Spalte im nachhinein auf DEFAULT NULL gesetzt wird, dann ändert das nichts an den Daten, dieser Spalte. Das heisst das die Spalte mit "" so bleibt. Du musst dann schon ein UPDATE durchführen und beim INSERT muss diese SPALTE mit NULL belegt werden anstatt "".

                    sqlfiddle dazu.

                    Wenn du kein NULL in der Spalte stehen hast dann geht das auch, aber dann ist die Spalte mit NOT NULL zu belegen.

                    Auch hierzu ein sqlfiddle.

                    Kommentar

                    Lädt...
                    X