# #sql #google-bigquery
#sql #google-bigquery
Вопрос:
Я планирую создать запланированный запрос в BigQuery, где он сначала выполнит некоторый запрос, чтобы проверить некоторые условия. Затем, если все условия выполнены, он выполнит запрос агрегации.
Что я могу придумать прямо сейчас, так это сделать что-то вроде этого:
declare A default (select count(*) from mydataset.mytable); --SELECT query to get a value declare B ... declare C ... . . . -- get all of the value into a variable -- Then use if-else condition e.g. if A gt; 100 and B = C D E and B = F and ... then -- run an aggregation queries else select "not pass the condition"; -- don't run anything end if;
Этот способ выполним, но я хочу сделать его более заметным, когда какое-то условие не выполняется. Я могу посмотреть позже, какое условие не пройдено. Есть идеи, как улучшить это при выполнении запланированного запроса?
Комментарии:
1. все ли ваши условия (
A
,B
,…) возвращают целые числа ? Если вы хотите точно знать, какое условие не прошло, вам нужно сделать несколько if-self вместо использованияand
s . Вы пробовали это сделать ?2. @ewertonvsilva еще не пробовал этого, но, похоже, это интересно. На данный момент я просто использую
RAISE USING MESSAGE
условие else, чтобы сделать его ошибкой, если оно не пройдет все. Я думаю, что могу адаптировать вашу идею для фильтрации каждого условия, например, если A != B, затем поднять, используя сообщение «A не равно B» и т. Д.
Ответ №1:
Комбинируя использование повышения и нескольких условных тестов, чтобы указать конкретную ошибку, вы можете использовать следующее:
BEGIN DECLARE A DEFAULT (SELECT COUNT(*) FROM `ds.table`); DECLARE B DEFAULT (SELECT COUNT(*) FROM `ds.table`); DECLARE C1 DEFAULT Agt;1; DECLARE C2 DEFAULT Bgt;A; IF C1 AND C2 THEN SELECT "Execute Query"; ELSE IF NOT (C1) THEN raise USING message="Condition 1 failed"; END IF; IF NOT (C2) THEN raise USING message="Condition 2 failed"; END IF; END IF; EXCEPTION WHEN ERROR THEN SELECT @@error.message; END;
Но если у вас будет несколько условий сбоя, лучше использовать select:
DECLARE A DEFAULT (SELECT COUNT(*) FROM `ds.table`); DECLARE B DEFAULT (SELECT COUNT(*) FROM `ds.table`); DECLARE C1 DEFAULT Agt;10; DECLARE C2 DEFAULT Bgt;A; IF C1 AND C2 THEN SELECT "Execute Query"; ELSE IF NOT (C1) THEN select "Condition 1 failed"; END IF; IF NOT (C2) THEN select "Condition 2 failed"; END IF; END IF;
Комментарии:
1. Да, если он потерпит неудачу, скорее всего, несколько условий потерпят неудачу. При выполнении второго способа запрос все равно будет успешно выполнен. Можем ли мы как-то объединить все неудачные условия и поднять в конце?
2. О, я просто думаю, что мы можем объявить переменную результата (по умолчанию Null), затем, если есть условие сбоя, я могу установить переменную и объединить ее и, наконец, проверить, по-прежнему ли эта переменная равна нулю или нет, если нет (означает, что произошло какое-то условие сбоя), затем вызвать ошибку