Formateur SQL BigQuery

Collez une requête BigQuery (GoogleSQL) et obtenez-la formatée instantanément. Les chemins `project.dataset.table` entre accents graves, les expressions STRUCT et ARRAY et les paramètres de requête @nommés sont tous gérés.

Une requête BigQuery, avant et après

La requête non formatée ci-dessous est l'exemple chargé dans l'éditeur plus haut, et la sortie est exactement ce que ce formateur en renvoie avec les options par défaut. Rien n'a été retouché à la main.

Collé
WITH sessions AS (SELECT user_id, session_id, TIMESTAMP_TRUNC(event_ts, HOUR) AS hr, ARRAY_AGG(event_name ORDER BY event_ts) AS events FROM `my-project.analytics.events` WHERE event_ts BETWEEN @start_ts AND @end_ts AND platform = @platform GROUP BY user_id, session_id, hr) SELECT hr, count(DISTINCT user_id) AS users, APPROX_QUANTILES(ARRAY_LENGTH(events), 100)[OFFSET(95)] AS p95_events FROM sessions WHERE ARRAY_LENGTH(events) > @min_events GROUP BY hr ORDER BY hr
Sortie formatée
WITH
  sessions AS (
    SELECT
      user_id,
      session_id,
      TIMESTAMP_TRUNC(event_ts, HOUR) AS hr,
      ARRAY_AGG(
        event_name
        ORDER BY
          event_ts
      ) AS events
    FROM
      `my-project.analytics.events`
    WHERE
      event_ts BETWEEN @start_ts AND @end_ts
      AND platform = @platform
    GROUP BY
      user_id,
      session_id,
      hr
  )
SELECT
  hr,
  count(DISTINCT user_id) AS users,
  APPROX_QUANTILES(ARRAY_LENGTH(events), 100) [OFFSET(95)] AS p95_events
FROM
  sessions
WHERE
  ARRAY_LENGTH(events) > @min_events
GROUP BY
  hr
ORDER BY
  hr

La syntaxe BigQuery qu'il gère

Un formateur générique massacre la syntaxe propre au dialecte ou la refuse tout net. Voici les constructions BigQuery contre lesquelles ce formateur est testé.

@name

Les paramètres de requête nommés de BigQuery sont détectés et regroupés : un paramètre réutilisé à travers plusieurs CTE n'est rempli qu'une fois.

`project.dataset.table`

Les chemins de table pleinement qualifiés entre accents graves restent d'un seul tenant.

UNNEST(array)

L'aplatissement de tableaux conserve la structure de sa clause.

arr[OFFSET(0)]

Les indices de tableau OFFSET et ORDINAL sont préservés tels quels.

STRUCT<...>

Les déclarations de type struct ne sont pas découpées.

FAQ du formateur BigQuery

Détecte-t-il les paramètres @nommés ?

Oui. Les paramètres @name de BigQuery sont listés dans le panneau Paramètres, regroupés par nom, et peuvent être remplis pour produire une requête exécutable.

Va-t-il abîmer mes chemins de table entre accents graves ?

Non. `project.dataset.table` est traité comme un identifiant quoté unique et passe sans modification.

Gère-t-il les expressions UNNEST, STRUCT et ARRAY ?

Oui. UNNEST garde sa structure de clause au lieu d'être reformaté comme un appel de fonction ordinaire, les déclarations de type STRUCT ne sont pas coupées en pleine déclaration, et ARRAY_AGG avec un ORDER BY interne conserve ce tri attaché à l'agrégat auquel il appartient.

Les indices de tableau comme OFFSET et ORDINAL survivent-ils au formatage ?

Oui, mot pour mot. Une expression chaînée comme APPROX_QUANTILES(x, 100)[OFFSET(95)] revient exactement telle qu'écrite au lieu d'être coupée au crochet — ce qui est précisément ce qui transforme une requête de percentile fonctionnelle en erreur de syntaxe.

Puis-je modifier la clause WHERE d'une seule CTE dans une longue requête GoogleSQL ?

Oui. Le WHERE de chaque bloc WITH apparaît séparément sous le nom de ce bloc : vous ouvrez celui qui vous intéresse, éditez ses conditions en arbre ou en graphe, et laissez tous les autres blocs intacts.

Fonctionne-t-il avec le SQL hérité de BigQuery ?

Non — cette page vise GoogleSQL, le dialecte standard de BigQuery et celui dans lequel les nouvelles requêtes devraient être écrites. Les références de tables entre crochets du SQL hérité ne sont pas analysées. S'il vous reste du SQL hérité, le migrer vaut mieux que le formater.