Как выбрать список полей в структуре по префиксу с помощью Bigquery - PullRequest
0 голосов
/ 01 апреля 2020

Я хочу сделать что-то вроде:

SELECT
  STRUCT(
    c.customer.name*,
    r.revenue.type*
  ) AS customer_revenue
FROM customer_table c
JOIN revenue_table r
USING (transaction_id)

Где customer - это структура, содержащая несколько полей, в том числе те, которые начинаются с «name» (а некоторые нет), и revenue аналогично является структурой, с некоторыми полями, которые начинаются с «типа», а с некоторыми полями, которые этого не делают.

Кажется, я не могу понять, как это сделать в BigQuery. Я просто продолжаю получать синтаксические ошибки, которые наводят меня на мысль, что это невозможно. Есть идеи?

1 Ответ

1 голос
/ 01 апреля 2020

Рассмотрим ниже альтернативный способ

#standardSQL
SELECT (
  SELECT STRING_AGG(x) 
    FROM UNNEST(REGEXP_EXTRACT_ALL(TRIM(TO_JSON_STRING(c.customer), '{}'), r'("name\w+":\w+)(?:,|$)')) x
  ) || ',' || (
    SELECT STRING_AGG(y) 
    FROM UNNEST(REGEXP_EXTRACT_ALL(TRIM(TO_JSON_STRING(r.revenue), '{}'), r'("type\w+":\w+)(?:,|$)')) y
  ) AS customer_revenue
FROM customer_table c
JOIN revenue_table r
USING (transaction_id)  

в случае ниже [супер упрощенных] данных

#standardSQL
WITH customer_table AS (
  SELECT 1 transaction_id, STRUCT(1 AS name1, 2 AS name2, 3 AS aaa3, 4 AS bbb4) customer
), revenue_table AS (
  SELECT 1 transaction_id, STRUCT(11 AS type11, 22 AS type22, 33 AS type33, 44 AS ccc44) revenue
)

результат будет

Row customer_revenue     
1   "name1":1,"name2":2,"type11":11,"type22":22,"type33":33     

Очевидно, что это не совсем то, что вы спрашиваете в своем вопросе - но, как я уже прокомментировал, «на самом деле не выполнимо: o (вам может потребоваться переосмыслить ваши требования»), поэтому вышеупомянутое решение может потенциально помочь вам в этом

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