2011-12-30 15 views
6

У меня есть следующие таблицы:SQL: Выбор столбцов на основе столбца значения из другой таблицы

UserPrivileges: 
+--------+------+------+------+ 
| UserID | Col1 | Col2 | Col3 | 
+--------+------+------+------+ 
|  1 | 0 | 1 | 1 | 
|  2 | 0 | 0 | 1 | 
|  3 | 1 | 0 | 0 | 
|  4 | 1 | 1 | 0 | 
+--------+------+------+------+ 

Data: 
+--------+------+------+------+ 
| DataID | Col1 | Col2 | Col3 | 
+--------+------+------+------+ 
|  1 | A | B | C | 
|  2 | D | E | F | 
|  3 | G | H | I | 
|  4 | J | K | L | 
+--------+------+------+------+ 

Мой вопрос в своей простейшей форме не имеет ничего общего с Data столом, но я просто объяснить это в любом случае так что я мог бы сделать это неправильно.

Как выбрать имена столбцов из UserPrivileges на основе значения? Чтобы я мог использовать результат в другом запросе, выберите только те столбцы.

Что-то вдоль этих линий:

SELECT (COLUMNS_NAME_QUERY_FROM_UserPrivileges(UserID='#')) WHERE DataID = '#' FROM Data

Или я не возражаю лучший способ для управления пользовательскими привилегиями для определенных столбцов.

ответ

6

Ответ зависит от ваших требований к результату. Требуется ли вам результат с последовательным набором столбцов, независимо от пользовательских привилегий? Если да, то вы могли бы установить запрещенные значения до нуля (или какой-либо другой особое значение), используя условие 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 = '#' 

Конечно, «особое значение» может быть проблемой, так как вам нужно значение которые никогда не появятся в данных. Если вам нужно знать эту разницу между нулевым значением, потому что реальное значение равно null или null, потому что это запрещенный столбец, вы не можете использовать null.

В другом подходе вам будет проще включить индикатор привилегии для каждого столбца в результате, и пусть ваша бизнес-логика использует это, чтобы определить, какие значения видны пользователю.

Очень другой подход имел бы набор результатов, содержащий только разрешенные столбцы. В этом случае вам нужно будет строить свой SQL-запрос динамически. Я не знаю, если вы делаете это в хранимой процедуре или на языке принимающей, но основная идея что-то вроде этого:

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

«выполнить», что означает, что вы имеете в наличии, чтобы выполнить строку как sql. более


после выяснены OP:

Ok, вам нужно 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

+0

Первый - это не то, что я ищу, а второй. мой вопрос в том, как вы напишете 'FIELDS_NAME_QUERY()'? –

+0

Как хранимая процедура/функция или на каком-то языке программирования? –

+0

В SQL, либо как S.P или Func. –

0

не пробовал, но что-то, как это должно работать

SELECT (SHOW COLUMNS FROM table WHERE expr) FROM data WHERE DataID = '#' 

Проверить этот пост для деталей - How can I get column names from a table in Oracle?

Дайте нам знать, как вы решить эту проблему ...

+0

Это должно решить вашу проблему - [получить имена столбцов из таблицы с определенным значением] (http://stackoverflow.com/questions/5631822/to-get-column-names-from-table-having-a-particular-value) –

+0

Кто-нибудь пробовал это, по крайней мере, в концепции? Я не использую mysql, но я был бы очень удивлен, если он сработает. Это означает, что результат столбцов отображения является полиморфным, и я не думаю, что mysql имеет такое поведение OO. –

Смежные вопросы