我在数据库中有两个表: 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
答案 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