Google bigquery 不为空不为“;过滤“;在大查询中正确

Google bigquery 不为空不为“;过滤“;在大查询中正确,google-bigquery,Google Bigquery,我正在处理大查询,并按预期返回结果,只需一个小细节。尽管我的不是空的限制,我仍然得到大量的NULL结果。据我所知,它正在检查错误的值是否为null 我要检查的是“firebase_screen”值是否为空。我试过以下方法: SELECT event_name, event_timestamp, event_date, ( SELECT value.string_value FROM UNNEST (event_params) WHERE key

我正在处理大查询,并按预期返回结果,只需一个小细节。尽管我的
不是空的
限制,我仍然得到大量的
NULL
结果。据我所知,它正在检查错误的值是否为null

我要检查的是“firebase_screen”值是否为空。我试过以下方法:

SELECT
  event_name,
  event_timestamp,
  event_date,
  (
  SELECT
    value.string_value
  FROM
    UNNEST (event_params)
  WHERE
    key = "firebase_screen" and key IS NOT NULL) as app_screen,
FROM
  `my_table_name`
WHERE
  event_name = 'button_click'
并尝试:

SELECT
  event_name,
  event_timestamp,
  event_date,
  (
  SELECT
    value.string_value
  FROM
    UNNEST (event_params)
  WHERE
    key = "firebase_screen" and value.string_value IS NOT NULL) as app_screen,
FROM
  `my_table_name`
WHERE
  event_name = 'button_click'
你知道如何正确地“过滤”掉
null
结果吗? 在这两种情况下,我得到的结果都是一样的

这是我从大查询中得到的原始JSON示例:

     {
        "key": "firebase_screen",
        "value": {
          "string_value": "home screen",
          "int_value": null,
          "float_value": null,
          "double_value": null
        }
      }
下面是两个查询的相同输出示例

| event_name   | event_timestampe | event_date | app_screen         |
|--------------|------------------|------------|-------------------|
| button_click | 1593616723965003 | 20200701   | null              |   
| button_click | 1593616726265005 | 20200701   | null              |   
| button_click | 1593616806351000 | 20200701   | maintain_screen_1 |   


因为您的app_screen字段是select子句中的一个子查询,所以如果该子查询的结果为null,您将在输出中选择null

考虑一下这样的情况:

select event_name, event_timestamp, event_date, value.string_value as app_screen
from `my_table_name`
left join unnest(event_params) ep
where event_name = 'button_click' -- main table logic
  and ep.key = 'firebase_screen' and ep.value.string_value is not null -- unnested logic

这应该会让您更接近,但如果没有精确的表模式,我无法保证这正是您想要的。

key=“firebase\u screen”和key不为NULL
这是一个同义反复。如果它等于该字符串,则根据定义它不为null。你没有说要检查键,而是要检查值。当然你的意思是
string\u值不为NULL
或类似值,以便按照你的要求检查值是否为NULL。正在修复。显示第二个SQL查询的所需和当前(错误)输出。您只显示了一条记录,其中的值不为null,但您抱怨包含null。它们在哪里?刚刚添加了一个示例@underline_dwy为什么您的输出有一个名为
trvscreen
的列,但两个查询都没有?为什么它有一个值
maintain\u screen\u 1
不在您的输入JSON中?谢谢!我得到了这个错误:字段名string\u value在[28:47]的STRUCT中不存在,它指的是
值。string\u value
在上一个
语句中,我进行了编辑。因为您没有提供模式,所以我不得不猜测一下
key
string\u value
的确切位置。如果我的编辑不起作用,查询的一般流程应该会起作用,您只需要检查前缀并验证字段的实际位置。这让我走上了正确的道路,解决了问题!谢谢你的帮助。