sql >> Database >  >> RDS >> Mysql

SQL:kolommen selecteren op basis van kolomwaarde uit een andere tabel

Het antwoord hangt af van uw vereisten voor het resultaat. Heeft u een resultaat nodig met een consistente set kolommen, ongeacht de gebruikersrechten? Als dat het geval is, kunt u de niet-toegestane waarden instellen op null (of een andere speciale waarde) met behulp van een IF-clausule, bijvoorbeeld

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 = '#'

Natuurlijk kan de "speciale waarde" een probleem zijn, omdat je een waarde nodig hebt die nooit in de gegevens zou verschijnen. Als u dat verschil tussen een null moet weten omdat de echte waarde null is versus null omdat het een verboden kolom is, kunt u null niet gebruiken.

Een andere benadering is dat u eenvoudig de privilege-indicator voor elke kolom in het resultaat opneemt en uw bedrijfslogica die laat gebruiken om te bepalen welke waarden zichtbaar zijn voor de gebruiker.

Een heel andere benadering zou zijn dat het resultaat alleen de toegestane kolommen bevat. In dit geval moet u uw SQL-instructie dynamisch opbouwen. Ik weet niet of je dit doet in een opgeslagen procedure of in een hosttaal, maar het basisidee is ongeveer als volgt:

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

"execute" betekent alles wat je beschikbaar hebt om een ​​string uit te voeren als een sql-opdracht.

meer na verduidelijking door OP:

Ok, je hebt een sql-functie nodig die een tekenreeks retourneert die eruitziet als "colname1, colname2, ...". Het volgende lijkt op hoe het eruit zou zien in sql-server. syntaxis

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


  1. Top 3 scores - MySQL

  2. Hoe u een controlebeperking voor één kolom in SQL Server kunt maken - SQL Server / TSQL-zelfstudie, deel 83

  3. Voeg meerdere records in SQL in waarbij waarden alle combinaties zijn van gedefinieerde bereiken in een enkele query

  4. Word lid van Alias ​​Columns SQL