sql >> Databáze >  >> RDS >> Mysql

SQL:Výběr sloupců na základě hodnoty sloupce z jiné tabulky

Odpověď závisí na vašich požadavcích na výsledek. Požadujete výsledek s konzistentní sadou sloupců bez ohledu na uživatelská práva? Pokud ano, můžete nastavit nepovolené hodnoty na null (nebo nějakou jinou speciální hodnotu) pomocí klauzule IF, např.

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

Problémem samozřejmě může být „zvláštní hodnota“, protože potřebujete hodnotu, která by se v datech nikdy neobjevila. Pokud jste potřebovali znát rozdíl mezi hodnotou null, protože skutečná hodnota je null vs. null, protože jde o zakázaný sloupec, nemůžete použít hodnotu null.

Jiný přístup by vám umožnil jednoduše zahrnout do výsledku indikátor oprávnění pro každý sloupec a nechat vaši obchodní logiku, aby to použila k určení, které hodnoty jsou viditelné pro uživatele.

Velmi odlišný přístup by měl sadu výsledků obsahovat pouze povolené sloupce. V tomto případě budete muset vytvořit příkaz SQL dynamicky. Nevím, jestli to děláte v uložené proceduře nebo v hostitelském jazyce, ale základní myšlenka je něco takového:

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

"execute" znamená cokoli, co máte k dispozici ke spuštění řetězce jako příkaz SQL.

více po upřesnění OP:

Dobře, potřebujete funkci sql, která vrátí řetězec, který vypadá jako "sloupec1, název2, ...". Následující se podobá tomu, jak by to vypadalo na serveru 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


  1. Jak Group_Concat() funguje v SQLite

  2. Laravel InvalidArgumentException v Carbon.php řádek 425:Koncová data s SQL databází

  3. Duplicitní záznam „0“ pro klíč „PRIMARY“

  4. Jak zvýšit hodnotu v příkazu aktualizace postgres na klíči JSON