如果查询结果在 BigQuery 中没有记录,则显示默认值

ala*_*oot 1 sql google-bigquery

查询可以在 BigQuery 上返回空表。发生这种情况的一个例子是,如果我join在 BigQuery 上查询一堆表,并且联接的结果是一个空表,或者如果没有基于子句的匹配项where

这是一个愚蠢的示例查询,它总是以空连接返回:

#standardSQL
WITH query1 AS (
    SELECT 1 AS number, "one" AS message
), query2 AS (
    SELECT 2 AS number, "two" AS message)
SELECT "query result" AS result, query1.* 
FROM query1
JOIN query2 ON query1.number = query2.number;
Run Code Online (Sandbox Code Playgroud)

该查询将显示以下输出:Query returned zero records.

如果是这种情况,我想返回一条消息或默认行。但我不知道该怎么做。我尝试过使用IFNULL,但这只适用于一列,不适用于列数。使用IF语句给我带来了错误,因为您无法从 if 语句返回行。我认为它给我的错误是Scalar subquery cannot have more than one column unless using SELECT AS STRUCT to build STRUCT values

我能想到但不知道如何实现的另一件事是UNION在末尾添加一个,只有在前面的部分没有返回任何内容时才会触发。或者将现有查询包装在WITH语句子查询中,如果没有返回任何内容,则打印一条消息,否则执行SELECT * FROM sub_query

我想在结果为空表时仅显示一条消息,或者返回带有一些默认值的行。我知道答案可能包含一个UNION声明,因此不可能只显示一条消息。在这种情况下,我想显示默认行。对于上面的示例查询,默认行如下所示:"No results found", NULL, NULL。当查询返回一个非空表时,我希望它看起来与原始查询完全相同。因此,不应添加任何列或更改结果的架构。

Gor*_*off 5

你会使用union all. 像这样的东西:

with t as (
      . . . <all your query stuff here>
     )
select cast(NULL as string) as msg, t.*
from t
union all
select msg, t.*  -- all the `t` columns will be `NULL`
from (select 'No rows returned' as msg) left join
     t
     on 1 = 0  -- always false
where not exists (select 1 from t);
Run Code Online (Sandbox Code Playgroud)

注意并发症。查询返回一组具有固定名称的固定列。此版本在数据开头返回一个额外的列来包含消息。为了获取所有其余的列,left join使用了 a,但该on子句始终为 false。


Mik*_*ant 5

选项1

如果您的查询没有返回结果,下面将显示全部为空的行

#standardSQL
WITH your_query AS ( ... )
SELECT * FROM your_query 
UNION ALL 
SELECT your_query.* REPLACE ("No results found" AS result)
FROM (SELECT 1) 
LEFT JOIN your_query ON FALSE
WHERE NOT EXISTS (SELECT 1 FROM your_query)  

Row result              number  message  
1   No results found    null    null     
Run Code Online (Sandbox Code Playgroud)

选项2

如果您事先知道输出模式 - 下面将返回默认行(假设 0 默认值number和“无”默认值)message

#standardSQL
WITH your_query AS ( ... )
SELECT * FROM your_query 
UNION ALL 
SELECT "No results found", 0, "none" FROM (SELECT 1) 
LEFT JOIN your_query ON FALSE
WHERE NOT EXISTS (SELECT 1 FROM your_query)

Row result              number  message  
1   No results found    0       none     
Run Code Online (Sandbox Code Playgroud)