-1

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

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

你知道实现这一目标的方法吗?或其他一些方式?

4

1 回答 1

2

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

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 ...;
于 2020-05-07T17:41:04.000 回答