基于子查询的SELECT列使用单个语句

时间:2013-10-11 05:09:44

标签: sql sqlite

我在数据库中有两个表: Artist Filter 。有没有在单个 SQL语句中根据过滤器的子查询结果查询 Artist 的列?

伪代码:

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

  • 艺术家
------------------------------------------
| id | FirstName | LastName | Genre      |
------------------------------------------
| 1  | John      | Coltrane | Jazz       |
| 2  | Jimi      | Hendrix  | Rock       | 
| 3  | Ulrich    | Schnauss | Electronic |
------------------------------------------
  • 过滤
--------------------------------
| id | ColumnName | ShowColumn |
--------------------------------
| 1  | FirstName  | 1          |
| 2  | LastName   | 0          |
| 3  | Genre      | 1          |
--------------------------------
  • 预期成果
-------------------------------
| id | FirstName | Genre      |
-------------------------------
| 1  | John      | Jazz       |
| 2  | Jimi      | Rock       | 
| 3  | Ulrich    | Electronic |
-------------------------------

我可以拥有的最好的是使用多个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

3 个答案:

答案 0 :(得分:0)

这在SQLite中是不可能的。

您必须首先阅读Filter中的列,然后使用这些列构建查询。

答案 1 :(得分: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')
;

答案 2 :(得分:-1)

这个查询怎么样:

select distinct a.id, a.FirstName, a.Genre 
from Artist a, Filter f 
where f.ShowColumn = 1