Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi If-Verzweigungen in SQL-Queries? (https://www.delphipraxis.net/71657-if-verzweigungen-sql-queries.html)

mjenke 19. Jun 2006 07:52

Datenbank: MySQL • Version: 3.23.55 • Zugriff über: ODBC

If-Verzweigungen in SQL-Queries?
 
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

Sidorion 19. Jun 2006 08:05

Re: If-Verzweigungen in SQL-Queries?
 
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:
Delphi-Quellcode:
decode(deptno,10,'ACCOUNTING',20,'RESEARCH','NONE')
wegen syntaxc mussu evtl nochmal gucken.

markusl 19. Jun 2006 08:10

Re: If-Verzweigungen in SQL-Queries?
 
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

mjenke 19. Jun 2006 08:31

Re: If-Verzweigungen in SQL-Queries?
 
@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.

:-D

Matthias

dfried 19. Jun 2006 08:42

Re: If-Verzweigungen in SQL-Queries?
 
Zitat:

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!

franktron 19. Jun 2006 08:58

Re: If-Verzweigungen in SQL-Queries?
 
Das mit if und else geht erst ab Version 5.0 also musst du das wohl mit deinem Prog machen,

omata 19. Jun 2006 15:28

Re: If-Verzweigungen in SQL-Queries?
 
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz