使用EXCEPT从select中动态排除某些字段



我们正在寻找一种从结果集中动态排除某些列的方法,我们尝试使用case表达式,但EXCEPT不喜欢它:

DECLARE hide_city  bool default true;
select * EXCEPT(case when hide_city then city end) from table

你知道实现这一点的方法吗?或者其他方式?

我知道,你很可能会期待更性感的东西,但我觉得这是迄今为止的唯一选择

DECLARE hide_city  bool DEFAULT TRUE;
IF hide_city THEN
SELECT * EXCEPT(city) FROM table;
ELSE 
SELECT * FROM table;
END IF;

如何将其与之前的CTE相结合?

这可以是如下所示的内容,因此您可以将CTE"转换"为TEMP表

DECLARE hide_city  bool DEFAULT TRUE;
CREATE TEMP TABLE myTable AS 
WITH myCTE AS (
SELECT ... UNION ALL
SELECT ... UNION ALL
...
SELECT ...
)
SELECT * FROM myCTE;
IF hide_city THEN
SELECT * EXCEPT(city) FROM myTable;
ELSE 
SELECT * FROM myTable;
END IF;    

显然,你根本不需要CTE,而是可以进行

CREATE TEMP TABLE myTable AS 
SELECT ... UNION ALL
SELECT ... UNION ALL
...
SELECT ...;

最新更新