使用EXCEPT动态地将一些字段从选择中排除。

问题描述 投票:1回答:1

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

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

你知道有什么方法可以实现吗?

google-bigquery
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 ...;
© www.soinside.com 2019 - 2024. All rights reserved.