2011-12-30 18 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]を、あなたは "colname1、colname2、..." のように見える文字列を返すSQL関数が必要。以下は、SQL Serverのように見えるものに似ています。構文
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

最初のものは私が探しているものではなく、2番目のものです。私の質問は '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を使用しませんが、動作すれば非常に驚くでしょう。これは、show columnsの結果が多相であることを意味し、mysqlにはそのようなオブジェクト指向の動作があるとは思われません。 –

関連する問題