0

データベースにはArtistFilterの 2 つのテーブルがあります。単一のSQL ステートメントでFilterのサブクエリ結果に基づいてArtistの列をクエリする方法はありますか?

疑似コード:

SELECT (SELECT ColumnName FROM Filter WHERE ShowColumn=1) FROM Artist

  • アーティスト
----------------------------------------------
| | ID | 名 | 姓 | ジャンル |
----------------------------------------------
| | 1 | ジョン | ジョン | コルトレーン | ジャズ |
| | 2 | ジミ | ジミ | ヘンドリックス | ロック | ロック |
| | 3 | ウルリッヒ | シュナウス | 電子 | 電子 |
----------------------------------------------
  • フィルター
--------------------------------
| | ID | 列名 | 表示列 |
--------------------------------
| | 1 | 名 | 1 |
| | 2 | 姓 | 0 |
| | 3 | ジャンル | 1 |
--------------------------------
  • 予想された結果
-------------------------------
| | ID | 名 | ジャンル |
-------------------------------
| | 1 | ジョン | ジョン | ジャズ |
| | 2 | ジミ | ジミ | ロック | ロック |
| | 3 | ウルリッヒ | 電子 | 電子 |
-------------------------------

私ができる最善の方法は multiple を使用するCASE..WHENことですが、それはそれほどエレガントではなく、余分な迷惑な NULL フィールドがいくつかあります。

SELECT 
    CASE WHEN (SELECT ShowColumn FROM Filter WHERE ColumnName='FirstName') THEN FirstName END, 
    CASE WHEN (SELECT ShowColumn FROM Filter WHERE ColumnName='LastName')  THEN LastName  END, 
    CASE WHEN (SELECT ShowColumn FROM Filter WHERE ColumnName='Genre')     THEN Genre     END
FROM Artist
4

3 に答える 3

0

このクエリはどうですか:

select distinct a.id, a.FirstName, a.Genre 
from Artist a, Filter f 
where f.ShowColumn = 1
于 2013-10-11T05:23:13.720 に答える
0

ターゲットがフォーマットされた出力である場合、つまりデータセットが必要ない場合は、最初の列に文字列を作成できます。

CSV 出力の例:

SELECT --Header
    'id'
    ||CASE (SELECT ShowColumn FROM Filter WHERE ColumnName='FirstName') WHEN 1 THEN ',FirstName' ELSE '' END
    ||CASE (SELECT ShowColumn FROM Filter WHERE ColumnName='LastName') WHEN 1 THEN ',LastName' ELSE '' END
    ||CASE (SELECT ShowColumn FROM Filter WHERE ColumnName='Genre') WHEN 1 THEN ',Genre' ELSE '' END
UNION ALL
SELECT --Data
    CAST(id AS TEXT)
    ||CASE WHEN mf=1 THEN ','||CAST(FirstName AS TEXT) ELSE '' END
    ||CASE WHEN ml=1 THEN ','||CAST(LastName AS TEXT) ELSE '' END
    ||CASE WHEN mg=1 THEN ','||CAST(Genre AS TEXT) ELSE '' END
FROM Artist
JOIN (SELECT ShowColumn AS mf FROM Filter WHERE ColumnName='FirstName')
JOIN (SELECT ShowColumn AS ml FROM Filter WHERE ColumnName='LastName')
JOIN (SELECT ShowColumn AS mg FROM Filter WHERE ColumnName='Genre')
;
于 2013-10-11T08:44:40.457 に答える