Bigquery 仅在不为空时选择列

Posted

技术标签:

【中文标题】Bigquery 仅在不为空时选择列【英文标题】:Bigquery select column only if not null 【发布时间】:2020-01-18 21:08:25 【问题描述】:

我是 Bigquery 和 SQL 的绝对初学者,如果这是一个愚蠢的问题,我深表歉意。我有一个这样的 bigquery 表

|Name|Value1|Value2|Value3|Value4|Value5|Value6|
|Ben |19    |45    |null  |19    |13    |null  |
|Bob |34    |null  |12    |null  |45    |43    |

我的查询仅选择与名称列中的名称匹配的一行。我希望结果只显示具有非空值的列。例如,如果我这样做 SELECT * FROM mytable WHERE Name = "Bob" 我希望结果看起来像

|Name|Value1|Value3|Value5|Value6|
|Bob |34    |12    |45    |43    |

同样,如果我选择 Ben,我希望结果看起来像

|Name|Value1|Value2|Value4|Value5|
|Ben |19    |45    |19    |13    |

我尝试过SELECT IF,但似乎语法不正确。

【问题讨论】:

你不能在标准 SQL 中这样做,因为 SQL 查询必须返回一个 fixed 列列表(数据库需要知道查询将由哪些列返回查询执行之前)。 虽然这无法完成——你很可能甚至不需要这样做——所以为了帮助你——解释为什么你认为你需要这样的输出?真正的用例是什么?当然,它可以轻松实现,但不同 如果同时选择 Ben 和 Bob 会怎样? 引用自问题 - “我的查询仅选择 一行 与名称列中的 [给定] 名称匹配” 那么可能有3个选择。第一个选择值到一个数组中,第二个选择 UNNEST(array from first select)。第三个重新展平结果并使用 where not null。 【参考方案1】:

您无法选择可变数量的列,但您可以使用聚合/透视函数的组合创建 SQL。您可能花费的时间比尝试去做的时间要多。我花了大约两个小时在文档上,但我仍然感到几乎一无所知(如果我没有在那里没有帐户,而且我自己的数据库没有相同的确切功能也无济于事)。

有关示例,请参阅 Google 的 BigQuery Documentation。

我认为您可以使用UNNEST()ARRAY() 来做到这一点,但在此过程中您会丢失原始列标题信息。

【讨论】:

【参考方案2】:

我怀疑它是否可以实现,因为任何 SQL 语句都会作用于记录,即各种列,所以如果一列为空,它将影响记录中要检索的所有列。 SQL 语句检索行(引用的列)

【讨论】:

【参考方案3】:

您不能在SQL 中动态执行此操作。如果您需要这样的查询,您可以手动创建它,但这取决于您想要达到的结果。

例如,在您展示的情况下,下面的查询可以工作,但您会丢失表的标题引用。

SELECT value1,value2,value4,value5 FROM mytable WHERE value3 IS NULL AND value6 is NULL
UNION ALL
SELECT value1,value3,value5,value6 FROM mytable WHERE value2 IS NULL AND value4 is NULL 

在此示例中,如果您有很多条件,则可能会看到这种查询构建起来很复杂。除此之外,UNION ALL 在每个单独的查询中总是需要相同数量的列才能工作。如果您需要创建一个通用查询来执行此操作,那将是不可能的。

希望对你有帮助

【讨论】:

以上是关于Bigquery 仅在不为空时选择列的主要内容,如果未能解决你的问题,请参考以下文章

仅在不为空时比较字段

在 Java8 中使用 lambda 仅在不为空时过滤值

仅当查询不为空时,才从查询写入 BigQuery 中的表

仅在其不为空的情况下更新 [重复]

仅在选中且不为空时才显示元素

VBScript 仅在文件不为空时附加文件