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。当查询返回一个非空表时,我希望它看起来与原始查询完全相同。因此,不应添加任何列或更改结果的架构。
你会使用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。
选项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)
| 归档时间: |
|
| 查看次数: |
6954 次 |
| 最近记录: |