Показать значение по умолчанию, если запрос не приводит к записи в BigQuery - PullRequest
0 голосов
/ 05 июня 2018

Запрос может вернуть пустую таблицу в 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;

Запрос покажет этот вывод: 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.Когда запрос возвращает непустую таблицу, я хочу, чтобы она выглядела точно так же, как и в исходном запросе.Поэтому не должно быть никаких добавленных столбцов или изменений в схеме результата.

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Опция 1

Ниже отображается строка со всеми пустыми значениями в случае, если для your_query не возвращен результат

#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     

Опция 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     
0 голосов
/ 05 июня 2018

Вы бы использовали 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);

Обратите внимание на осложнения.Запрос возвращает фиксированный набор столбцов с фиксированным набором имен.Эта версия возвращает дополнительный столбец в начале данных для хранения сообщения.Чтобы получить все остальные столбцы, используется left join, но предложение on всегда ложно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...