Mysql
 sql >> Base de données >  >> RDS >> Mysql

SQL :sélection de colonnes en fonction de la valeur de colonne d'une autre table

La réponse dépend de vos exigences pour le résultat. Avez-vous besoin d'un résultat avec un ensemble cohérent de colonnes, quels que soient les privilèges de l'utilisateur ? Si tel est le cas, vous pouvez définir les valeurs non autorisées sur null (ou sur une autre valeur spéciale) à l'aide d'une clause IF, par exemple,

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

Bien entendu, la "valeur spéciale" peut poser problème, car vous avez besoin d'une valeur qui n'apparaîtra jamais dans les données. Si vous aviez besoin de connaître la différence entre un null parce que la valeur réelle est null et null parce qu'il s'agit d'une colonne interdite, vous ne pouvez pas utiliser null.

Une autre approche consisterait à inclure simplement l'indicateur de privilège pour chaque colonne dans le résultat et à laisser votre logique métier l'utiliser pour déterminer quelles valeurs sont visibles pour l'utilisateur.

Une approche très différente consisterait à ce que le jeu de résultats ne contienne que les colonnes autorisées. Dans ce cas, vous devrez créer votre instruction SQL de manière dynamique. Je ne sais pas si vous faites cela dans une procédure stockée ou dans un langage hôte, mais l'idée de base ressemble à ceci :

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

"exécuter" signifie tout ce dont vous disposez pour exécuter une chaîne en tant que commande sql.

plus après clarification par OP :

Ok, vous avez besoin de la fonction sql qui renvoie une chaîne qui ressemble à "colname1, colname2, ...". Ce qui suit ressemble à ce à quoi cela ressemblerait dans le serveur sql. syntaxe

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