0

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

伪代码:

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

  • 艺术家
------------------------------------------
| 编号 | 名字 | 姓氏 | 类型 |
------------------------------------------
| 1 | 约翰 | 科尔特兰 | 爵士乐 |
| 2 | 几米 | 亨德里克斯 | 摇滚 |
| 3 | 乌尔里希 | 施瑙斯 | 电子 |
------------------------------------------
  • 筛选
--------------------------------
| 编号 | 列名 | 显示栏 |
--------------------------------
| 1 | 名字 | 1 |
| 2 | 姓氏 | 0 |
| 3 | 类型 | 1 |
--------------------------------
  • 预期成绩
-------------------------------------------
| 编号 | 名字 | 类型 |
-------------------------------------------
| 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

这在 SQLite 中是不可能的。

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

于 2013-10-11T07:55:28.657 回答
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 回答