SQL Abfrage mit Concat und Coalesce

rayman88

Benutzer
Beiträge
11
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
 
Werbung:
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

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?
 
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.
 
Werbung:
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.

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.
 
Zurück
Oben