Все item_ids, где item_id не равен NULL, а page_id равен 23784
Ниже для BigQuery Standard SQL
#standardSQL
SELECT
(SELECT value FROM UNNEST(params) param WHERE key = 'item_id') item_id
FROM `project.dataset.table`
WHERE (
SELECT COUNT(1)
FROM UNNEST(params) param
WHERE param = ('page_id', 23784)
OR key = 'item_id'
) = 2
Вы можете проверить, поиграть с выше, используя фиктивные данные, как показано ниже
#standardSQL
WITH `project.dataset.table` AS (
SELECT 2018 dt, 'screenShow' event,
[STRUCT<key STRING, value INT64>('item_id', 1), ('page_id', 23784), ('irrelevant_id', 5)] params UNION ALL
SELECT 2018 dt, 'screenShow' event,
[STRUCT<key STRING, value INT64>('item_id', 2), ('irrelevant_id', 7)] params UNION ALL
SELECT 2018 dt, 'screenShow' event,
[STRUCT<key STRING, value INT64>('item_id2', 1), ('page_id', 23784), ('irrelevant_id', 5)] params
)
SELECT
(SELECT value FROM UNNEST(params) param WHERE key = 'item_id') item_id
FROM `project.dataset.table`
WHERE (
SELECT COUNT(1)
FROM UNNEST(params) param
WHERE param = ('page_id', 23784)
OR key = 'item_id'
) = 2
с результатом
Row item_id
1 1
Очевидно, что если вместо простого списка item_id вам нужна целая строка - вы просто используете SELECT *, как показано ниже
#standardSQL
SELECT *
FROM `project.dataset.table`
WHERE (
SELECT COUNT(1)
FROM UNNEST(params) param
WHERE param = ('page_id', 23784)
OR key = 'item_id'
) = 2
в этом случае вы получите
| row | date | event | params.key | params.value |
-------------------------------------------------------
| 1 | 2018 | screenShow | item_id | 1 |
| page_id | 23784 |
| irrelevant_id | 5 |