mikrocontroller.net

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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: bib (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dr. Sommer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: DPA (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: bib (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Dr. Sommer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: DPA (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eventuell könnte man mit einigen Subselects und cross joins was drehen 
(ungetestet):
CREATE VIEW werte AS
SELECT id, 1 AS eintrag, wert_001 AS wert
CROSS JOIN (SELECT id, 2 AS eintrag, wert_002)
CROSS JOIN (SELECT id, 3 AS eintrag, wert_003)
CROSS JOIN (SELECT id, 4 AS eintrag, wert_004)
CROSS JOIN (SELECT id, 5 AS eintrag, wert_005)
CROSS JOIN (SELECT id, 6 AS eintrag, wert_006)
CROSS JOIN (SELECT id, 7 AS eintrag, wert_007)
CROSS JOIN (SELECT id, 8 AS eintrag, wert_008);

SELECT * from werte WHERE id = 10 AND eintrag = 5;

Autor: DPA (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Edit: Das FROM einfach dazudenken, ist mir in der eile irgendwie 
entfallen.

Autor: bib (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: T-SQL (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: CppBert3 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jan H. (j_hansen)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.