Auge: Bedingung in WHERE-Klausel

Beitrag lesen

Hallo

Tach!

... Post.

Danke für die Erinnerung, da muss ich auch noch hin.

Da im Gegensatz zum von mir vorgestellten Szenario bei einigen Einträgen der Benutzername und die Email eines registrierten Benutzers sehr wohl in der Tabelle Beitraege drinstehen, damit also in beiden Tabellen vorhanden sind, fallen dedlfixs Angebote IFNULL und COALESCE weg, da sie eines der beiden Felder als leer (bzw. NULL) erfordern.

NULL erfordern beide nicht unbedingt. Es kommt nun drauf an, ob der Dreh- und Angelpunkt die user_id ist, oder ob du anhand der Inhalte entscheiden kannst, was genommen werden soll. Soll die registrierte Angabe vor der Beitragsangabe genommen werden, dann kann COALESCE(reg.Name, beitrag.name) die gewünschten Daten liefern. Soll primär die Beitragsangabe genommen werden, muss diese NULL sein, wenn der Nutzer registriert ist und diese Daten nehmen willst: COALESCE(beitrag.name, reg.name). Das geht so auch in dem Fall, dass eine vorhandene Beitragsangabe immer eine registrierte Angabe übertrumpfen soll.

Beide von dir vorgeschlagenen Wege wären gangbar.

Unter der Voraussetzung, dass für einen registrierten Benutzer Name und Email in der Tabelle Benutzer vorhanden sind, kann man die Felder vor denen der Tabelle Beitraege abfragen, wobei ein Wert != NULL heraus kommt (erfrischend, mit der Nase auf das Offensichtliche, nämlich die Umkehr der Abfrage, gestoßen zu werden). In einer der beiden Tabellen sind die gewünschten Daten definitiv hinterlegt, manchmal auch in beiden, wobei dann die Tabelle Benutzer Priorität hat.

Andererseits ist für einen registrierten Benutzer in der Tabelle Beitraege immer eine user_id > 0 eingetragen und in der Tabelle Benutzer gibt es dann auch einen passenden Datensatz. Von daher empfinde ich die Unterscheidung anhand dieses Datums als sauberer.

In dem Fall mit zwei Werten ist auch IFNULL() eine Alternative zu COALESCE().

Mit der Funktion CASE aus der Ablaufsteuerung funktioniert das.

Wenn die user_id ausschlaggebend ist, kannst du IF() nehmen. Das lässt sich bei einfachen Alternativen kürzer schreiben.

die von mir gewählte Syntax

CASE WHEN t1.user_id > 0 THEN t2.name ELSE t1.name END AS name

die von dir vorgeschlagene

IF(t1.user_id > 0, t2.name, t1.name) AS name

Korrekt so?

Wo ich gerade vor dem Posting sitze, frage ich mich, was ich als besser lesbar empfinde. Die CASE-Syntax brauche ich nur vorlesen, um sie zu verstehen. Wenn ich die IF-Syntax vorlese, ersetze ich die Kommata auch nur durch Wenn-Dann-Sonst, womit sie an der Stelle für mich gleichwertig sind. Gibt es gravierende Unterschiede in der Kompatibilität zu anderen SQL-Systemen? Ist eine der beiden Formen in Sachen Wiederverwendbarkeit in anderen Systemen vorzuziehen?

Tschö, Auge

--
Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
Terry Pratchett, "Wachen! Wachen!"
ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}
Veranstaltungsdatenbank Vdb 0.3