Обработайте несколько условий перед выполнением задания BigQuery с помощью запланированного запроса

# #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), затем, если есть условие сбоя, я могу установить переменную и объединить ее и, наконец, проверить, по-прежнему ли эта переменная равна нулю или нет, если нет (означает, что произошло какое-то условие сбоя), затем вызвать ошибку