Forum: PC-Programmierung Oracle SQL - Spalte im WHERE Selektieren


von bib (Gast)


Lesenswert?

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

von Dr. Sommer (Gast)


Lesenswert?

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

von DPA (Gast)


Lesenswert?

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.

von bib (Gast)


Lesenswert?

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.

von Dr. Sommer (Gast)


Lesenswert?

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...

von DPA (Gast)


Lesenswert?

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;

von DPA (Gast)


Lesenswert?

Edit: Das FROM einfach dazudenken, ist mir in der eile irgendwie 
entfallen.

von bib (Gast)


Lesenswert?

@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...

von T-SQL (Gast)


Lesenswert?

/*    ==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

von CppBert3 (Gast)


Lesenswert?

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.

von Jan H. (j_hansen)


Lesenswert?

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
Noch kein Account? Hier anmelden.