Mysql
 sql >> Baza danych >  >> RDS >> Mysql

SQL:Wybieranie kolumn na podstawie wartości kolumny z innej tabeli

Odpowiedź zależy od Twoich wymagań dotyczących wyniku. Czy potrzebujesz wyniku ze spójnym zestawem kolumn, niezależnie od uprawnień użytkownika? Jeśli tak, możesz ustawić niedozwolone wartości na null (lub inną specjalną wartość) za pomocą klauzuli IF, np.

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

Oczywiście „wartość specjalna” może stanowić problem, ponieważ potrzebujesz wartości, która nigdy nie pojawiłaby się w danych. Jeśli musisz znać różnicę między wartością null, ponieważ rzeczywista wartość to null i null, ponieważ jest to zabroniona kolumna, nie możesz użyć wartości null.

Inne podejście wymagałoby prostego włączenia wskaźnika uprawnień dla każdej kolumny wyświetlanej w wyniku i umożliwienia logice biznesowej wykorzystania tego w celu określenia, które wartości są widoczne dla użytkownika.

W zupełnie innym podejściu zestaw wyników zawierałby tylko dozwolone kolumny. W takim przypadku będziesz musiał dynamicznie zbudować instrukcję sql. Nie wiem, czy robisz to w procedurze składowanej, czy w języku hosta, ale podstawowa idea jest mniej więcej taka:

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

"wykonaj" oznacza wszystko, co masz dostępne do wykonania ciągu jako polecenia sql.

więcej po wyjaśnieniu przez OP:

Ok, potrzebujesz funkcji sql, która zwraca ciąg, który wygląda jak "nazwa_kolumny1, nazwa_kolumny2, ...". Poniżej przypomina to, jak wyglądałby na serwerze sql. składnia

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. jak uzyskać pozycję posortowanych wierszy za pomocą mysql i php

  2. Jak zmienić strefę czasową MySQL w połączeniu z bazą danych za pomocą Javy?

  3. Uzyskiwanie błędu Entity Framework podczas uruchamiania migracji w bazie danych MySQL. Nieprawidłowe użycie indeksu przestrzennego/pełnotekstowego/haszowania i wyraźnej kolejności indeksów

  4. Wyszukiwanie MySQL dla 1,2,3,11,22,33 w terenie

  5. Jak wyłączyć buforowanie SQLAlchemy?