Feld abhängig von anderem Feld und gleichzeitig von ID

prestelino

Benutzer
Beiträge
7
Hallo alle zusammen,

ich hoffe meine Überschrift ist nicht zu kryptisch... es geht um folgendes.
Ich möchte eine SQL-Abfrage basteln:
Select ID, Name, Privat, Kommentar from tblDatenspeicherung
where name like '%bla%'

Da kommt dann z.B. eine Liste mit 5 Einträgen raus.

Jetzt mein Problem, wo ich nicht weiterkomme: das Feld 'Kommentar' hätte ich gerne abhängig von 'Privat', d.h. nur wenn in Privat eine 1 steht, soll der Kommentar angezeigt werden. Falls in Privat eine 0 steht, dann Kommentar = leeres Feld oder auch 'xxx' - ganz egal.
Das muss ja aber pro ID einzeln passieren und da steh ich auf dem Schlauch.
Also zur Klarstellung:
meine 5 Ergebnisse haben 5 unterschiedliche IDs. Von den 5 sind 2 Einträge mit privat = 1 und 3 Einträge mit privat = 0.
Und in der Liste mit den 5 Ergebnissen soll nun eben das Feld Kommentar nur bei den IDs befüllt sein, wo privat = 1 ist.

Hoffe das war verständlich :)

Gibt es da eine Lösung?


Danke vorab vom prestelino
 
Werbung:
Du willst einen Datensatz mit einem Feldinhalt finden, nach dem Du zwar suchst, ihn aber fallweise nicht anzeigen?
Das ist etwas seltsam.
Du kannst mit Case im select statement die Ausgabe fallweise abschalten.

Ohne den Anwendungsfall zu kennen: Ich würde sagen, es riecht nach mangelhafter Modellierung.
Wenn in der Kommentarspalte Daten enthalten sind, die wichtig für einen Geschäftsprozess sind, dann sollte dieser Feldinhalt orgendlich abgebildet werden. Und wenn es sich um private Daten handelt, sollten m.E. eher die nicht angezeigt werden, als in geschäftlichen Fällen.

 
Code:
SELECT ID, Name, Privat, (CASE WHEN Privat = 1 THEN Kommentar ELSE NULL END) AS Kommentar
FROM tblDatenspeicherung
WHERE name LIKE '%bla%'
Müsste auch gehen:
Code:
SELECT ID, Name, Privat, (CASE Privat WHEN 1 THEN Kommentar ELSE NULL END) AS Kommentar
FROM tblDatenspeicherung
WHERE name LIKE '%bla%'
Oder ohne CASE:
Code:
SELECT ID, Name, Privat, Kommentar
FROM tblDatenspeicherung
WHERE Privat = 1
AND name LIKE '%bla%'
UNION ALL
SELECT ID, Name, Privat, NULL
FROM tblDatenspeicherung
WHERE Privat = 0
AND name LIKE '%bla%'
Letzteres ist aber weniger elegant oder performant.
 
Noch ne zweite Frage dazu:
aktuell plane ich zwei Abfragen - für Personenkreis A, der die Kommentare sehen darf (sprich ich keine case-Einschränkung brauche) und für Personenkreis B, mit der case-Abfrage

Der erlaubte Personenkreis steht in tblPerson mit einer PersonID, in der Tabelle steht auch die ID aus tblDatenspeicherung.

Kann man den case auch so aufbauen, dass ich nur eine Abfrage für beide Personenkreise nutzen kann?
Sprich, wenn aktuelle User-ID = PersonID aus tblPerson und privat = 1 dann Kommentar anzeigen, sonst NULL???

Danke nochmals vom prestelino
 
Wenn du von "sehen darf" redest geht es ja scheinbar um Rechte. Kannst du sicherstellen das die Abfrage nicht vom Benutzer verändert werden kann oder Dinge wie SQL-Injection auftreten können? Das ist durchaus ein komplexes Thema und ich vermute das du hier mit einer selbst gebauten Lösung Sicherheitslücken einbauen wirst. Auch ist das i.S. Performance vielleicht nicht so geil.

Es gibt durchaus Wege wie man das lösen kann. Hat eine Person immer nur Zugriff auf ihre eigenen Datensätze? Wie viele Personen verwenden das oder sind es tatsächlich nur genau zwei unterschiedliche Gruppen / Sachverhalte?

Welche SQL Version und Edition kommt zum Einsatz?
 
Das SQL wird von mir eingegeben in einer Software. Der SQL-Befehl wird dann über einen technischen User an den SQL Server 2019 gesendet und das Ergebnis zurück dem User angezeigt. D.h. beeinflussen kann die SQL keiner.

Es haben ca. 20 Personen Zugriff auf die Datensätze. Dabei dürfen alle Personen auch alle Datensätze an sich sehen, mit z.B. ID und Name (und weiteren Spalten, die hab ich nur im Beispiel weggelassen um es übersichtlicher zu halten).
Es gibt nur die Einschränkung, dass eben ein bestimmter definierter Personenkreis (die in tblPerson stehen) die Inhalte bei Kommentare wenn Privat=1 sehen darf, während die restlichen User eben die Inhalte der Kommentare nicht sehen, sondern nur die Inhalte aller restlichen Spalten...

Krieg ich das sauber in einer SQL hin???
 
Hast du eine Variable über den du den Namen des ausführenden Benutzers in die WHERE-Bedingung einfügen kannst? Dann ja.

Es gibt mehrere Möglichkeiten, die einfachste wäre einfach den Berechtigungskreisen einfach verschiedene Abfragen zukommen zu lassen. Das scheint aber mühselig zu sein und birgt natürlich Fehlerquellen.

Mit der Variablen kannst du aber auch mit der Tabelle tblPerson arbeiten und auf dieser Basis entscheiden.
Code:
SELECT tblDatenspeicherung.ID, tblDatenspeicherung.Name, (CASE WHEN tblDatenspeicherung.Privat = 1 AND tblPerson.ID IS NOT NULL THEN Kommentar ELSE NULL END) AS Kommentar
FROM tblDatenspeicherung
LEFT JOIN tblPerson
ON tblPerson.name = %Systemvariable_Benutzername%
WHERE tblDatenspeicherung.name LIKE '%bla%'
Der Join ist nicht ganz ungefährlich, ich gehe davon aus das es den Benutzer in der tblPeron genau einmal gibt wenn er den Kommentar sehen können soll. Gibt es ihn nicht kann er den Kommentar nicht sehen weil der LEFT JOIN keinen Datensatz joint.
 
Werbung:
Zurück
Oben