AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi If-Verzweigungen in SQL-Queries?

If-Verzweigungen in SQL-Queries?

Ein Thema von mjenke · begonnen am 19. Jun 2006 · letzter Beitrag vom 19. Jun 2006
Antwort Antwort
mjenke

Registriert seit: 28. Mär 2003
Ort: Bonn
131 Beiträge
 
#1

If-Verzweigungen in SQL-Queries?

  Alt 19. Jun 2006, 07:52
Datenbank: MySQL • Version: 3.23.55 • Zugriff über: ODBC
Guten Morgen, alle miteinander!


Folgendes Problem stellt sich mir:

Ich habe eine Datenbank, in der unter anderem Gesetze und Normenketten in zwei Tabellen liegen (tgesetze, tnormen).
Diese Normen und die Gesetze sind über IDs miteinander verknüpft:


tgesetze
--------
ID - Schlüssel des Gesetzes
THESNR - Thesaurusnummer die auch zur Sortierung herangezogen wird
GESETZ - Name des Gesetzes (z. B. EStG 1997, LStR 1996 etc.)

tnormen
-------
IDGESETZ - Fremdschlüssel. Ist die ID aus tgesetze
THESNR - Thesaurusnummer. KANN besetzt sein (ist sie leer, ist sie nicht NULL, sondern -1).


Jetzt muss ich eine Liste von Normen aus der Datenbank ziehen, die nach der Thesaurusnummer (und damit indirekt auch nach dem Gesetzesnamen aus tgesetze) sortiert ist. Dabei gilt aber folgende Regel:
  • Wenn in tnormen KEINE THESNR angegeben ist, soll die Verbindung zu tgesetze über IDGESETZ hergestellt werden.
  • Wenn allerdings eine THESNR in tnormen ANGEGEBEN ist, muss die Verbindung zu tgesetze über diese THESNR hergestellt werden. Diese THESNR ist eine nachträglich manuell hergestellte Verbindung von der Norm zum Gesetz, die in jedem Fall Vorrang hat.

Meine Frage ist nun:

Wie kann ich in EINER einzigen Query eine Abfrage so gestalten, dass entschieden wird, über welches Feld aus tnormen (IDGESETZ oder THESNR) nun die Verbindung zu tgesetze hergestellt wird? Oder ist dies gar nicht möglich und ich muss mir einen ganz anderen Weg überlegen?

So nach dem Motto:

SQL-Code:
SELECT t1.*, t2.gesetz FROM
tnormen t1
if t1.THESNR <> -1 then LEFT JOIN tgesetze t2 ON t1.THESNR = t2.THESNR
else LEFT JOIN tgesetze t2 ON t1.IDGESETZ = t2.ID
ORDER BY ...

An der Struktur der Datenbank kann ich hier nichts ändern, da dies vom Kunden so vorgegeben wurde. Ich muss nur einen Weg finden, mich da durchzuboxen.


Falls jemand eine Möglichkeit weiss, wie ich das bewerkstelligen könnte, wäre ich echt dankbar. Es brennt mir nämlich ein bisschen auf den Nägeln, da ich heute morgen erst drangehen konnte, aber auch heute fertig werden muss.



Matthias
Matthias Jenke
  Mit Zitat antworten Zitat
Sidorion

Registriert seit: 23. Jun 2005
403 Beiträge
 
#2

Re: If-Verzweigungen in SQL-Queries?

  Alt 19. Jun 2006, 08:05
das Zauberwort heisst decode.
decode(expr[,search,result][,default])
es können beliebige [,search,result]-Paare angeben. Entspricht expr einem der searches in dieser Liste, so wird der korrespondierende result angenommen, wenn keiner passt, dann der defaultwert.
beispiel:
decode(deptno,10,'ACCOUNTING',20,'RESEARCH','NONE') wegen syntaxc mussu evtl nochmal gucken.
Manchmal sehen Dinge, die wie Dinge aussehen wollen mehr wie Dinge aus, als Dinge
<Esmerelda Wetterwachs>
  Mit Zitat antworten Zitat
markusl

Registriert seit: 25. Apr 2006
Ort: Rotkreuz
21 Beiträge
 
Delphi 5 Enterprise
 
#3

Re: If-Verzweigungen in SQL-Queries?

  Alt 19. Jun 2006, 08:10
Hallo,
Zitat:
SQL-Code:
SELECT t1.*, t2.gesetz FROM
tnormen t1
if t1.THESNR <> -1 then LEFT JOIN tgesetze t2 ON t1.THESNR = t2.THESNR
else LEFT JOIN tgesetze t2 ON t1.IDGESETZ = t2.ID
ORDER BY ...
Evtl. so? (nicht getestet etc.)

SQL-Code:
(SELECT t1.*, t2.gesetz
  FROM tnormen t1, gesetz t2
  WHERE t1.THESNR = t2.THESNR
    AND t1.THESNR <> -1)

UNION

(SELECT t1.*, t2.gesetz
  FROM tnormen t1, gesetz t2
  WHERE t1.THESNR = -1
    AND t1.IDGESETZ = t2.ID)
ORDER BY ...
Bin nicht sicher ob das so 100%ig in Mysql funktioniert.
Wie gesagt ungetestet, nicht optimiert etc. aber vielleicht als Anregung.

HTH

Markus
  Mit Zitat antworten Zitat
mjenke

Registriert seit: 28. Mär 2003
Ort: Bonn
131 Beiträge
 
#4

Re: If-Verzweigungen in SQL-Queries?

  Alt 19. Jun 2006, 08:31
@Sidorion:

Zitat:
das Zauberwort heisst decode.
decode(expr[,search,result][,default])
Das mit dem decode verstehe ich noch nicht so ganz. In der MySQL-Doku finde ich "decode" nur zum Dekodieren von Passwörtern. In einem anderen Zusammenhang finde ich das nicht.

@Markus:

SQL-Code:
(SELECT t1.*, t2.gesetz
  FROM tnormen t1, gesetz t2
  WHERE t1.THESNR = t2.THESNR
    AND t1.THESNR <> -1)

UNION

(SELECT t1.*, t2.gesetz
  FROM tnormen t1, gesetz t2
  WHERE t1.THESNR = -1
    AND t1.IDGESETZ = t2.ID)
ORDER BY ...
Die Idee fand ich klasse, aber MySQL 3.23.55 unterstützt noch kein "union". Das kommt erst ab der 4er-Version. Und die Version darf ich leider nicht ändern.

Aber vielleicht kann ich eine temporäre Tabelle anlegen, die Queries - wie in dem Union-Beispiel - nacheinander ausführen und die Ergebnismengen in die temporäre Tabelle schreiben, um dann auf die hier vorhandenen (bereinigten) Datensätze eine dritte Query abzusetzen und die temporäre Datei wieder zu entfernen.



Matthias
Matthias Jenke
  Mit Zitat antworten Zitat
dfried

Registriert seit: 16. Aug 2005
486 Beiträge
 
#5

Re: If-Verzweigungen in SQL-Queries?

  Alt 19. Jun 2006, 08:42
Zitat von Sidorion:
das Zauberwort heisst decode.
decode(expr[,search,result][,default])
Das funktioniert zwar super mit ORACLE Datenbanken, aber leider gibt es das nicht bei MySQL!
  Mit Zitat antworten Zitat
franktron

Registriert seit: 11. Nov 2003
Ort: Oldenburg
1.446 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#6

Re: If-Verzweigungen in SQL-Queries?

  Alt 19. Jun 2006, 08:58
Das mit if und else geht erst ab Version 5.0 also musst du das wohl mit deinem Prog machen,
Frank
Tux sein Lieblingsquellcode
While anzfische<TuxSatt do begin
Fisch:=TFisch.Create; Tux.EssenFisch(Fisch); Fisch.Free;inc(anzfische); end;
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: If-Verzweigungen in SQL-Queries?

  Alt 19. Jun 2006, 15:28
Und was spricht gegen...

SQL-Code:
SELECT t1.*, CASE WHEN t1.THESNR <> -1
               THEN t2a.gesetz
               ELSE t2b.gesetz
             END gesetz
FROM tnormen t1
LEFT JOIN tgesetze t2a
  ON t1.THESNR = t2a.THESNR
LEFT JOIN tgesetze t2b
  ON t1.IDGESETZ = t2b.ID
ORDER BY ...
[vergiss es, habe oben nochmal gelesen]
Das mit der -1 finde ich allerdings nicht so elegant. Muss das so sein? Warum nicht NULL für diesen Fall!
[/vergiss es, habe oben nochmal gelesen]

MfG
Thorsten
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:50 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz