Hallo Zusammen,
ich habe eine Tabelle welche etwa so aufgebaut ist
ID, Beschreibung, WERT_001, WERT_002 .. WERT_100, TIMESTAMP
nun möchte ich IM WHERE selektieren welche Spalte ich ausgeben möchte
Idealerweise
SELECT ID, Beschreibung,
CASE irgendwas ... WERT_...,
TIMESTAMP
WHERE 1=1
AND ~irgendwas~ = 34
dann gibt er mir die WERT-Spalte 34 Zurück...
geht sowas?
Vielen Dank
bib schrieb:> ID, Beschreibung, WERT_001, WERT_002 .. WERT_100, TIMESTAMP
Oh Graus... Bei so einem Schema sind viele Kopfschmerzen
vorprogrammiert.
Sowas macht man mit 2 Tabellen:
Tabelle1:
ID, Beschreibung, TIMESTAMP
und Tabelle2:
ID (primary key), Tab1ID (foreign Key nach Tabelle1.ID), Wert (Ersatz
für WERT_XXX), WertNummer (1-100)
(Sinnvolle Namen und Datentypen vorausgesetzt)
Dann geht das ganz simpel so:
SELECT Tabelle1.ID, Tabelle1.Beschreibung, Tabelle2.Wert FROM Tabelle1,
Tabelle2 WHERE Tabelle1.ID = Tabelle2.Tab1ID AND Tabelle2.WertNummer =
34
WHERE filtert nur. Du kannst ein case im SELECT haben, du kannst auch im
WHERE ein CASE haben. Du kannst dem case einen alias geben, aber den
kann man im WHERE nicht brauchen (dafür aber im HAVING) Auch ein Select
auf ein Subselect ist möglich "select (select case ... ) a WHERE a=x".
Aber das was du sagst du brauchst, im WHERE was anderes als filtern, das
geht nicht.
für den aufbau der Tabelle kann ich nix...
naja, ich hab mittlerweile schon eine Idee, ist aber von der Performance
ein Graus...
vom Prinzip kann man mit einem Unpivot ähnlich wie Dr. Sommer die
Tabelle umbauen und dann entsprechend auch mit dem Where die eine
gewollte Spalte zurückgeben. Leider ist das aktuell noch unperformant.
Ich freue mich aber auf weitere Ideen.
bib schrieb:> Ich freue mich aber auf weitere Ideen.
Wie wäre es damit, wie beschrieben 2 Tabellen zu machen, und mit einem
View (und einer etwas hässlichen Abfrage) die ursprüngliche Tabelle zu
simulieren? Quasi als Adapter, bis man allen Code an die neue Struktur
anpassen kann. Funktioniert dann nur leider nur beim Lesen...
@Dr. Sommer
nun die Idee ist an sich gut...
Aber wir reden hier von einer Komplexen Systemlandschaft. Da kann ich
nicht einfach die Tabellen ändern.
Ebenso bau ich hier nur eine Auswertung... der Grund warum das in eine
Where soll ist weil die Kunden entsprechend die Where Manipulieren
können, den Select allerdings nicht. <- der Kunde möchte aber gern Wert
12 oder Wert 76 haben...
UNPIVOT ist momentan okay, aber performancetechnisch irgendwie nicht das
Idealste...
bib schrieb:> SELECT ID, Beschreibung,> CASE irgendwas ... WERT_...,> TIMESTAMP> WHERE 1=1> AND ~irgendwas~ = 34
da du das Schema ja nicht ändern (obwohl das ziemlich schlecht und
Resourcen-intersiv ist) kannst - warum erzeugst du dir dann nicht
einfach das passenden SELECT Statement als String zur Laufzeit?
wenn du den Wert_34 haben willst machst du eben ein "SELECT WERT_34 ..."
usw.
mach mal ein "vollständiges" Beispiel mit einer sinnvollen Anfrage -
dann kann man dir auch helfen
gut wäre auch noch vielleicht: Sprache, Betriebssystem etc.
Das Schema kann so schon sinnvoll sein. Die krude Auswerteanforderung
ist eher das Problem.
Ich würde einen View anlegen, der die Daten flach aufbereitet:
ID, Beschreibung, Nummer, WERT_(Nummer), TIMESTAMP
Man kann natürlich auch gleich die Query so anlegen. Dann kann man die
gewünschte Selektion einfach umsetzen.