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

SQL Abfrage mit Concat und Coalesce

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von rayman88, 7 November 2014.

  1. rayman88

    rayman88 Benutzer

    Hallo,
    ich muss aufgrund meiner Ausbildung gerade einige SQL Abfragen erstellen und habe bei folgender Abfrage ein kleines Problem. An sich funktioniert die Abfrage, jedoch ist es so das es halt Personen gibt, die über keinen Titel verfügen, statt des Titels soll dann an der Stelle eben nichts stehen. Ich weiß das man mit Coalese halt NULL Ausgaben vermeiden kann und die '' in meinem Fall ersetzen könnte, jedoch bekomme ich es nicht hin.
    Vielleicht hat hier jemand ja einen Tipp für mich, würde mich auf jeden Fall sehr freuen.

    select mitarbeiter.PIN,case when geschlecht.geschlecht= 'W'
    then concat('Sehr geehrte Frau ',mitarbeiter.titel, person.vname, ' ',person.nname)
    else concat('Sehr geehrter Herr ',mitarbeiter.titel, person.vname, ' ',person.nname) end as Anrede,
    from person join mitarbeiter join geschlecht
    where (mitarbeiter.PIN= person. PIN) and (geschlecht.geschlecht= person.geschlecht);

    Gruß rayman
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Was ist denn an coalesce(spalte, 'ersatz') so schwer?

    Btw.: Deine Syntax ist gruselig, Du machst da offenbar einen CROSS JOIN und legts die Join-Condition in die Where-Condition. Das ist massiv FAIL.
    Warum eigentlich eine extra Tabelle für das Geschlecht einer Person?
     
  3. rayman88

    rayman88 Benutzer

    Hi, ich bin SQL Neuling also bitte entschuldige meine gruselige Syntax,
    das Problem ist das ich nicht weiß an welcher stelle ich das coalesce anwenden muss.
    Mittels des Geschlechts wähle ich aus welche Form der Anrede ausgegeben wird.
     
  4. rayman88

    rayman88 Benutzer

    Hat sich erledigt hab's hinbekommen, manchmal sieht man den Wald vor lauter Bäumen nicht
     
  5. akretschmer

    akretschmer Datenbank-Guru

    Code:
    test=# create table nullwerte(id int, titel text);
    CREATE TABLE
    test=*# insert into nullwerte values (1, 'Herr');
    INSERT 0 1
    test=*# insert into nullwerte values (2, NULL);
    INSERT 0 1
    test=*# insert into nullwerte values (2, 'Frau');
    INSERT 0 1
    test=*# select id, coalesce(titel, 'unbekanntes Wesen') from nullwerte ;
     id |  coalesce
    ----+-------------------
      1 | Herr
      2 | unbekanntes Wesen
      2 | Frau
    (3 rows)
    
    

    Die Syntax für Select ist allgemein so:

    Code:
    Command:  SELECT
    Description: retrieve rows from a table or view
    Syntax:
    [ WITH [ RECURSIVE ] with_query [, ...] ]
    SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]
      * | expression [ [ AS ] output_name ] [, ...]
      [ FROM from_item [, ...] ]
      [ WHERE condition ]
      [ GROUP BY expression [, ...] ]
      [ HAVING condition [, ...] ]
      [ WINDOW window_name AS ( window_definition ) [, ...] ]
      [ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] select ]
      [ ORDER BY expression [ ASC | DESC | USING operator ] [ NULLS { FIRST | LAST } ] [, ...] ]
      [ LIMIT { count | ALL } ]
      [ OFFSET start [ ROW | ROWS ] ]
      [ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ]
      [ FOR { UPDATE | NO KEY UPDATE | SHARE | KEY SHARE } [ OF table_name [, ...] ] [ NOWAIT ] [...] ]
    
    where from_item can be one of:
    
      [ ONLY ] table_name [ * ] [ [ AS ] alias [ ( column_alias [, ...] ) ] ]
      [ LATERAL ] ( select ) [ AS ] alias [ ( column_alias [, ...] ) ]
      with_query_name [ [ AS ] alias [ ( column_alias [, ...] ) ] ]
      [ LATERAL ] function_name ( [ argument [, ...] ] ) [ AS ] alias [ ( column_alias [, ...] | column_definition [, ...] ) ]
      [ LATERAL ] function_name ( [ argument [, ...] ] ) AS ( column_definition [, ...] )
      from_item [ NATURAL ] join_type from_item [ ON join_condition | USING ( join_column [, ...] ) ]
    
    and with_query is:
    
      with_query_name [ ( column_name [, ...] ) ] AS ( select | values | insert | update | delete )
    
    TABLE [ ONLY ] table_name [ * ]
    
    Wie gesagt: Du verwendest da offenbar einen Cross Join, suchst aber wohl eher einen Left Join. Dieser benötigt eine Join-Condition, diese hast Du in die Where-Condition gebaut. Mag sein, daß da sogar was (richtiges) rauskommt, aber aufgrund des Cross Joins ist das um Größenordnungen teurer, bei einigen Tausend Einträgen wird Dein Server daher explodieren.
     
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