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...
Eventuell könnte man mit einigen Subselects und cross joins was drehen (ungetestet):
1 | CREATE VIEW werte AS |
2 | SELECT id, 1 AS eintrag, wert_001 AS wert |
3 | CROSS JOIN (SELECT id, 2 AS eintrag, wert_002) |
4 | CROSS JOIN (SELECT id, 3 AS eintrag, wert_003) |
5 | CROSS JOIN (SELECT id, 4 AS eintrag, wert_004) |
6 | CROSS JOIN (SELECT id, 5 AS eintrag, wert_005) |
7 | CROSS JOIN (SELECT id, 6 AS eintrag, wert_006) |
8 | CROSS JOIN (SELECT id, 7 AS eintrag, wert_007) |
9 | CROSS JOIN (SELECT id, 8 AS eintrag, wert_008); |
10 | |
11 | SELECT * from werte WHERE id = 10 AND eintrag = 5; |
Edit: Das FROM einfach dazudenken, ist mir in der eile irgendwie entfallen.
@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...
/* ==Scripting Parameters== Source Server Version : SQL Server 2017 (14.0.1000) Source Database Engine Edition : Microsoft SQL Server Enterprise Edition Source Database Engine Type : Standalone SQL Server Target Server Version : SQL Server 2017 Target Database Engine Edition : Microsoft SQL Server Enterprise Edition Target Database Engine Type : Standalone SQL Server */ create table zz_t (id int identity(1,1), val1 nchar(2), val2 nchar(2), val3 nchar(2), val4 nchar(4)); go insert into zz_ t (val1,val2,val3,val4) values ('a1','b1','c1','d1'); insert into zz_ t (val1,val2,val3,val4) values ('a2','b2','c2','d2'); insert into zz_ t (val1,val2,val3,val4) values ('a3','b3','c3','d3'); insert into zz_ t (val1,val2,val3,val4) values ('a4','b4','c4','d4'); go SELECT id, theCol, theVal FROM (select id, val1, val2, val3, val4 from zz_t) p UNPIVOT (theVal FOR theCol IN (val1, val2, val3, val4) ) as up; go -- results id theCol theVal 1 val1 a1 1 val2 b1 1 val3 c1 1 val4 d1 2 val1 a2 2 val2 b2 2 val3 c2 2 val4 d2 3 val1 a3 3 val2 b3 3 val3 c3 3 val4 d3 4 val1 a4 4 val2 b4 4 val3 c4 4 val4 d4
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.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.