NULL Wert Überprüfung

Hallo,

meine erste Frage hier, ich hoffe ihr könnt mir helfen :slight_smile:

Ich bin dabei, eine Filmdatenbank zu entwickeln, und mache gerade die Tabellendefinitionen und Grundabfragen.

Ich habe eine View definiert, die folgende Ergebnisse zurückliefert:

cd_id / film_id / title / language / plot original_title
1 / 2 / and your / engl / in a roadtrip / y tu mama
3 / 4 / NULL / engl / NULL / jurassic parc

Also wenn die cd in einer anderen Sprache ist als der Originalfilm, kommen alle werte richtig.
Wenn die CD dagegen auch in der Originalsprache des films ist, z.b. bei Jurassic parc ( die cd ist dann auf englisch, wie der Original) kommen NULL werte raus.

Wie kann ich eine Funktion schreiben, die auf NULL überprüft, und wenn es NULL ist, die NULLEN durch die Ergebnisse eines anderen Querys ersetzt ?

Man muß keine Funktion schreiben. So etwas beinhaltet die SQL-Sprache: … WHERE xxx IS NULL oder … WHERE xxx IS NOT NULL. (SELECT-Befehl)


So etwas macht man mit dem Befehl UPDATE.


Siehe Doku: SQL Commands



mfg

fristo

aber die view ist schon erstellt, und ich möchte das direkt durch SQL machen. Sozusagen:

  1. view erstellen
  2. die werte in der spalte “titel” der view, wo der wert null ist, durch einen anderen wert ersetzen (und den würde ich durch ein query bekommen)
  3. die werte in der spalte “plot” der view, wo der wert null ist, durch einen wert ersetzen, den ich durch eine query bekomme.

Kann man eine View also sequentiell erstellen? sozusagen:

create view my_view as (select …) ;
update my_view set title="select title from original_language where id= ?? " where title is null;

Ich möchte dass diese update authomatisch erfolgt, wenn die view erstellt wird, und zwar jedese mal … die befehle update und select kenne ich natürlich…

ich denke da bräuchte ich ein trigger odre so oder ?

Hallo jesus_edu,

Das “möchte” mag deine Vorsatz sein. Wenn es so nicht lösbar ist, nützt das “möchte” nichts. PostgreSQL liefert Dir aber alle Möglichkeiten um das Problem zu lösen. Flexibilität ist daher angesagt.

Grundsätzlich sollte man bei der Dateneingabe dafür sorgen, dass ein Datensatz gültige Werte erhält. Der Wert NULL in einer Spalte bedeutet immer, dass der Wert undefiniert ist. (Dieses kann aber auch gewollt sein). Will oder muss man bei der Eingabe Datensätze vervollstängigen, verwendet man einen Trigger. Ein Trigger selbst beschreibt aber nur unter welchen Bedingungen er ausgeführt werden soll und welche Funktion er für die Bearbeitung aufrufen soll. Funktionen erstellt man normalerweise mit Datenbanksprache PL/pgSQL (siehe Doku). Es stehen aber auch Schnittstellen zu anderen Sprachen zur Verfügung.

Importiert man ein große Menge von Daten, die zudem auch noch aufbereitet werden müssen, ist es sinnvoll ohne Trigger zu arbeiten. Die Aufbereitung der Daten erfolgt dann nach dem Import der Daten durch eine eigene Funktion. Dieses ist effektiever als mit Triggern zu arbeiten.

Das, was Deinen Vorstellungen entspricht, ist nur sinnvoll wenn sich die Werte in den Spalten, die den Wert NULL bei der Selektion enthalten, sich ständig dynamisch ändern. Das geht aus Deiner Beschreibung aber nicht hervor. Die Aufbereitung der Daten beim Import ist daher das sinnvollste.

Du kannst aber auch den View durch eine Funktion gleichen Namens ersetzen und in der Funktion die Daten entsprechend aufbereiten. Auch kannst Du mit Triggern arbeiten. Dahinter versteckt sich ja auch eine Funktion. Beide Methoden sind aber in Deinem Fall nicht effektiv.

Ein Blick in die Doku kann Dir weiterhelfen. Es gibt da viele Beispiele wie man Probleme lösen kann.



hallo,

ich glaub ich habs nicht genau erklärt. …
also die sache ist so:
ich hab eine tabelle movies(id, language, regisseur, original_title, original_plot, year) (also meine idee war, hier alle filme zu speichern, mit dem originaltitel,original language, und plot auf originaler sprache.
dann hab ich noch user_movies(cdID, movieID, language) also die cds an sich… ich kann z.b. den film “jurassic park” auf deutsch und englisch haben. Das sind 2 verschiedene CDs.

Und für die informationen in fremder sprache, hab ich filmForeign(filmid, language, title, plot) . Da wäre der Titel und Plot gegebenfalls auf deutsch.

Z.b. :
film
1 / engl / spielberg / jurassic parc / blablablaOriginal
2 / engl / regi / the hills have eyes / blablablaOriginal

usr_movies
1 / 1 / engl
2 / 2 / engl
3 / 2 / deutsch

also ich hab 1: jurassic parc auf originalsprache englisch
2: the hills have eyes auf originalsprache englisch
3: the hills have eyes auf deutsch

dann hab ich:
filmForeign
2 / deutsch / die blütigen … / plotAufDeutsch
Da speichere ich die Titeln und Plots auf Fremdspracher . Primary key wäre hier (filmID, sprache) und filmID wäre klar auch eine foreign key

Meine view erstelle ich durch ein join und bekomme:
view_user_filme
1 / jurassic parc / englisch / blablablaOriginal
2 / the hills have eyes / englisch / blablablaOriginal
3 / NULL / deutsch / NULL

versteht ihr was ich meine ? :slight_smile: ich möchte (ja, wieder ein möchte :wink: ) dass bei der view irgendwie überprüft wird, ob der eintrag ein NULL ist, und wenn ja, dann hole die informationen durch ein query.
Die view soll dann so aussehen:
view_user_filme
1 / jurassic parc / englisch / blablablaOriginal
2 / the hills have eyes / englisch / blablablaOriginal
3 / die blütigen… / deutsch / plotAufDeutsch


Also was meint ihr? soll ich das durch ein Trigger oder durch PL / pgSQL machen?
Ich importiere keine Dateien, ich bin noch bei der tabellen-erstellung und die daten hab ich manuell eingetragen. Mit triggers und PL/pgSQL habe ich noch nie was gemacht ,aber ich möchte das lernen … was habt ihr dann für ideen? (nachdem ich ausführlicher erläutert hab was ich meine und hoffentlich verständlicher ) :wink:

Schau mal nach, ob dir “Conditional Expressions” weiterhelfen - Stichwort ist die Funktion “COALESCE”.

The COALESCE function returns the first of its arguments that is not null. Null is returned only if
all arguments are null. This is often useful to substitute a default value for null values when data is
retrieved for display, for example…

Wenn dir das nicht hilft, solltest du dir das Kapitel über Stored Procedures angucken.

Gruß, eazy

vielen dank! ich werde mir das anschauen! :slight_smile: