使用 Bigquery regexp_extract 获取列名称

问题描述 投票:0回答:1

我需要使用视图 INFORMATION_SCHEMA.JOBS_BY_PROJECT 中的 query 列进行查询,以获取使用字符串函数 regexp_extract 提交的查询的列名称。

对于聚合函数,我们可以不考虑count(*),并且别名不匹配。我只想要不带括号的列名称和函数名称(例如 max、min)。此外,它应该不区分大小写,并且可以匹配查询中任意数量区域中的列名称。 我一直在考虑使用 regexp_extract 的方法是取回 SELECT 和 FROM 之间的所有匹配项,然后对其进行处理以删除任何括号和聚合函数名称,但我不确定如何将其转换为有效的 BQ 查询。

在此示例中,我希望取回 Staff_id。

WITH cte_sales AS (
    SELECT 
        staff_id, 
        COUNT(*) order_count  
    FROM
        sales.orders
    WHERE 
        YEAR(order_date) = 2018
    GROUP BY
        staff_id

)
SELECT
    AVG(order_count) average_orders_by_staff
FROM 
    cte_sales;
regex google-cloud-platform google-bigquery metadata
1个回答
0
投票

在完美的世界中,这种类型的用例应该使用ZetaSQL来解决,另请参阅ZetaSQL工具包

同时,如果您确实非常需要在纯 BigQuery 中实现它 - 请参阅下面的方法(查看 ML.GENERATE_TEXT 了解详细信息)

CREATE TEMP FUNCTION get_column_names(text STRING) AS ((
SELECT TRIM(STRING(ml_generate_text_result['predictions'][0]['content']), '" ')
  FROM ML.GENERATE_TEXT(MODEL `your_project.your_dataset.your_model_llm`,
  (SELECT FORMAT("In provided SQL text - provide list of columns used in SELECT statements. SHow only columns from input data, ignore computed columns in output. Do not provide any comments, explanations. Don't even provide header to that list. Just show list of columns: %s", text)  AS prompt)
)));
WITH sample_data AS (
  SELECT '''WITH cte_sales AS (
      SELECT staff_id, COUNT(*) order_count  
      FROM sales.orders
      WHERE YEAR(order_date) = 2018
      GROUP BY staff_id
    )
    SELECT AVG(order_count) average_orders_by_staff
    FROM  cte_sales;''' AS sql UNION ALL
  SELECT '''SELECT id, ST_UNION_AGG(ST_POINTN(ring, index)) outer_points,
      ANY_VALUE(point) point, ANY_VALUE(points) points
    FROM your_table, 
    UNNEST([ST_EXTERIORRING(ST_BUFFER(point, 100e3, num_seg_quarter_circle => points /4))]) ring,
    UNNEST(GENERATE_ARRAY(1, ST_NUMPOINTS(ring) - 1)) index
    GROUP BY id''' 
)
SELECT sql, get_column_names(sql) AS columns
FROM sample_data

有输出

© www.soinside.com 2019 - 2024. All rights reserved.