Mysql
 sql >> база данни >  >> RDS >> Mysql

SQL:Избиране на колони въз основа на стойност на колона от друга таблица

Отговорът зависи от вашите изисквания към резултата. Имате ли нужда от резултат с последователен набор от колони, независимо от правата на потребителя? Ако е така, можете да зададете непозволените стойности на null (или някаква друга специална стойност), като използвате клауза IF, например,

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

Разбира се, „специалната стойност“ може да е проблем, тъй като имате нужда от стойност, която никога няма да се появи в данните. Ако трябва да знаете тази разлика между нула, защото реалната стойност е нула срещу нула, защото е забранена колона, тогава не можете да използвате нула.

Друг подход би бил просто да включите индикатора за привилегии за всяка колона, която се появява в резултата, и да оставите вашата бизнес логика да използва това, за да определи кои стойности са видими за потребителя.

Много различен подход би накарал наборът от резултати да съдържа само разрешените колони. В този случай ще трябва да изградите своя sql оператор динамично. Не знам дали правите това в съхранена процедура или на хост език, но основната идея е нещо подобно:

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

"изпълни" означава всичко, което имате на разположение, за да изпълните низ като sql команда.

повече след пояснение от OP:

Добре, имате нужда от sql функция, която връща низ, който изглежда като "colname1, colname2, ...". Следното прилича на това, което би изглеждало в sql сървър. синтаксис

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. Свързване с MySQL от Eclipse (CDT)

  2. MySQL автоматично увеличаване на базата на група

  3. Haversine Fomula с MySQL получава близки местоположения

  4. SQL Избор от две таблици с вътрешно присъединяване и ограничение

  5. разлика между първичен ключ и уникален ключ