Mysql
 sql >> Datenbank >  >> RDS >> Mysql

SQL:Auswählen von Spalten basierend auf Spaltenwerten aus einer anderen Tabelle

Die Antwort hängt von Ihren Anforderungen an das Ergebnis ab. Benötigen Sie ein Ergebnis mit einem konsistenten Spaltensatz, unabhängig von den Benutzerprivilegien? In diesem Fall könnten Sie die unzulässigen Werte mithilfe einer IF-Klausel, z. B.

, auf null (oder einen anderen speziellen Wert) setzen
SELECT IF (p.col1 = 0 THEN NULL ELSE d.col1) AS col1, 
       IF (p.col2 = 0 THEN NULL ELSE d.col2) AS col2,
       IF (p.col3 = 0 THEN NULL ELSE d.col3) AS col3
FROM Data d, 
     UserPrivileges p
WHERE p.userId = '#' 
  AND d.DataId = '#'

Natürlich könnte der „Sonderwert“ ein Problem darstellen, da Sie einen Wert benötigen, der niemals in den Daten auftauchen würde. Wenn Sie diesen Unterschied zwischen einer Null wissen müssen, weil der reale Wert null ist, und null, weil es eine verbotene Spalte ist, können Sie null nicht verwenden.

Bei einem anderen Ansatz würden Sie einfach den Berechtigungsindikator für jede im Ergebnis erscheinende Spalte einfügen und Ihre Geschäftslogik diese verwenden lassen, um zu bestimmen, welche Werte für den Benutzer sichtbar sind.

Bei einem ganz anderen Ansatz würde die Ergebnismenge nur die zulässigen Spalten enthalten. In diesem Fall müssen Sie Ihre SQL-Anweisung dynamisch erstellen. Ich weiß nicht, ob Sie dies in einer gespeicherten Prozedur oder in einer Hostsprache tun, aber die Grundidee ist ungefähr so:

string sqlCmd = "SELECT " 
    + (SELECT (FIELDS_NAME_QUERY(UserID='#') 
       FROM USER_PRIVILEGES 
       WHERE userid='#') 
    + FROM data d 
execute sqlCmd

"Ausführen" bedeutet, was immer Sie zur Verfügung haben, um eine Zeichenfolge als SQL-Befehl auszuführen.

mehr nach Klärung durch OP:

Ok, Sie brauchen eine SQL-Funktion, die eine Zeichenfolge zurückgibt, die wie "Spaltenname1, Spaltenname2, ..." aussieht. Das Folgende ähnelt dem, wie es in SQL Server aussehen würde. Syntax

create function   
FIELDS_NAME_QUERY (@userid int)  
begin  
select col1, col2, col3... INTO @col1priv, @col2priv, @col3priv FROM userPrivileges WHERE UserId = @UserId  
declare @result varhcar(60)  
set @result = ''  
if (@col1priv = 1) @result = 'col1'  
if (@col2priv = 1) @result = @result + ' ,col2'  
if (@col3priv = 1) @result = @result + ' ,col3'  
return @result  
end