A resposta depende de seus requisitos para o resultado. Você precisa de um resultado com um conjunto consistente de colunas, independentemente dos privs do usuário? Nesse caso, você pode definir os valores não permitidos como nulos (ou algum outro valor especial) usando uma cláusula IF, por exemplo,
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 = '#'
Claro, o "valor especial" pode ser um problema, pois você precisa de um valor que nunca apareceria nos dados. Se você precisava saber essa diferença entre um null porque o valor real é null vs. null porque é uma coluna proibida, então você não pode usar null.
Outra abordagem faria com que você simplesmente incluísse o indicador de privilégio para cada coluna que aparecesse no resultado e deixasse sua lógica de negócios usar isso para determinar quais valores são visíveis para o usuário.
Uma abordagem muito diferente teria o conjunto de resultados para conter apenas as colunas permitidas. Nesse caso, você precisará construir sua instrução sql dinamicamente. Não sei se você está fazendo isso em um procedimento armazenado ou em uma linguagem host, mas a ideia básica é algo assim:
string sqlCmd = "SELECT "
+ (SELECT (FIELDS_NAME_QUERY(UserID='#')
FROM USER_PRIVILEGES
WHERE userid='#')
+ FROM data d
execute sqlCmd
"execute" significa o que você tem disponível para executar uma string como um comando sql.
mais após esclarecimento pelo OP:
Ok, você precisa de uma função sql que retorne uma string que se pareça com "colname1, colname2, ...". O seguinte é semelhante ao que seria no sql server. sintaxe
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