sql >> Databasteknik >  >> RDS >> Mysql

SQL:Välja kolumner baserat på kolumnvärde från en annan tabell

Svaret beror på dina krav på resultatet. Behöver du ett resultat med en konsekvent uppsättning kolumner, oavsett användarprivat? Om så är fallet kan du ställa in de otillåtna värdena till null (eller något annat specialvärde) med hjälp av en IF-sats, t.ex.

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

Naturligtvis kan det "särskilda värdet" vara ett problem, eftersom du behöver ett värde som aldrig skulle visas i data. Om du behövde veta skillnaden mellan en null eftersom det verkliga värdet är null vs. null eftersom det är en förbjuden kolumn så kan du inte använda null.

Ett annat tillvägagångssätt skulle få dig att enkelt inkludera privilegieindikatorn för varje kolumn som visas i resultatet, och låt din affärslogik använda den för att avgöra vilka värden som är synliga för användaren.

Ett helt annat tillvägagångssätt skulle få resultatet att bara innehålla de tillåtna kolumnerna. I det här fallet måste du bygga din sql-sats dynamiskt. Jag vet inte om du gör detta i en lagrad procedur eller på ett värdspråk, men grundidén är ungefär så här:

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

"exekvera" betyder vad du än har tillgängligt för att köra en sträng som ett SQL-kommando.

mer efter klargörande av OP:

Ok, du behöver sql-funktion som returnerar en sträng som ser ut som "kolnamn1, kolnamn2, ...". Följande liknar hur det skulle se ut i sql-servern. 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


  1. Skicka till Mysql med Php med Salt&MD5

  2. Hur man ändrar alla tabellprefix i en enda fråga

  3. #1067 - Ogiltigt standardvärde för 'bonusid' hur kan jag åtgärda detta fel?

  4. Ställ in en beständig global MySQL-parameter