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

SQL:Valg af kolonner baseret på kolonneværdi fra en anden tabel

Svaret afhænger af dine krav til resultatet. Har du brug for et resultat med et ensartet sæt kolonner, uanset brugernes privs? Hvis det er tilfældet, kan du indstille de ikke-tilladte værdier til null (eller en anden speciel værdi) ved hjælp af en IF-klausul, f.eks.

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

Selvfølgelig kan den "særlige værdi" være et problem, da du har brug for en værdi, der aldrig ville blive vist i dataene. Hvis du havde brug for at kende forskellen mellem en null, fordi den reelle værdi er null vs. null, fordi det er en forbudt kolonne, så kan du ikke bruge null.

En anden tilgang ville have dig til at inkludere privilegieindikatoren for hver kolonne, der vises i resultatet, og lade din forretningslogik bruge det til at bestemme, hvilke værdier der er synlige for brugeren.

En meget anden tilgang ville have resultatet sat til kun at indeholde de tilladte kolonner. I dette tilfælde skal du bygge din sql-sætning dynamisk. Jeg ved ikke, om du gør dette i en lagret procedure eller på et værtssprog, men den grundlæggende idé er noget som denne:

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

"execute" betyder hvad end du har til rådighed for at udføre en streng som en sql-kommando.

mere efter afklaring fra OP:

Ok, du har brug for sql-funktion, der returnerer en streng, der ligner "colname1, colname2, ...". Det følgende ligner, hvordan det ville se ud i sql-serveren. syntaks

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. Forældretræ i mysql-tabel (while-loop)

  2. Hvad er PostgreSQL svarende til SQL Server NVARCHAR?

  3. Hvordan skriver man en begrænsning vedrørende et maks. antal rækker i postgresql?

  4. Hvad er STATISTICS PROFIL i SQL Server?