Mysql
 sql >> Database >  >> RDS >> Mysql

SQL:selezione di colonne in base al valore della colonna da un'altra tabella

La risposta dipende dalle tue esigenze per il risultato. Hai bisogno di un risultato con un insieme coerente di colonne, indipendentemente dai privilegi dell'utente? In tal caso, puoi impostare i valori non consentiti su null (o qualche altro valore speciale) utilizzando una clausola IF, ad esempio,

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

Naturalmente, il "valore speciale" potrebbe essere un problema, poiché è necessario un valore che non compaia mai nei dati. Se avevi bisogno di conoscere la differenza tra un null perché il valore reale è null e null perché è una colonna vietata, non puoi usare null.

Un altro approccio prevede di includere semplicemente l'indicatore di privilegio per ciascuna colonna visualizzata nel risultato e lasciare che la logica aziendale lo utilizzi per determinare quali valori sono visibili all'utente.

Un approccio molto diverso prevede che il set di risultati contenga solo le colonne consentite. In questo caso dovrai creare la tua istruzione sql in modo dinamico. Non so se lo stai facendo in una procedura memorizzata o in una lingua host, ma l'idea di base è qualcosa del genere:

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

"esegui" significa tutto ciò che hai a disposizione per eseguire una stringa come comando sql.

di più dopo il chiarimento di OP:

Ok, hai bisogno della funzione sql che restituisca una stringa che assomigli a "colname1, colname2, ...". Quanto segue assomiglia a come sarebbe nel server sql. sintassi

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