Lon*_*nUK 2 sql google-cloud-sql google-bigquery
我在 bigquery 中有一个表,它有 100 多列,有超过 7000 万行。我想知道是否可以编写一个查询来提取任何列包含值“FINISHED”的行。
以下是 BigQuery 标准 SQL 对您来说应该是一个好的开始:)
#standardSQL
SELECT <columns to output>
FROM yourTable AS t
WHERE REGEXP_CONTAINS(LOWER(TO_JSON_STRING(t)), 'finished')
Run Code Online (Sandbox Code Playgroud)
您可以使用以下虚拟数据来测试/玩它
#standardSQL
WITH yourTable AS (
SELECT 'a' AS x, 'b' AS y, 'c' AS z UNION ALL
SELECT 'finished', '', '' UNION ALL
SELECT '', 'Bigquery Select from table where any column contains "FINISHED"','' UNION ALL
SELECT '', '', 'aaa' UNION ALL
SELECT 'finished', 'bbb', 'finished'
)
SELECT *
FROM yourTable AS t
WHERE REGEXP_CONTAINS(LOWER(TO_JSON_STRING(t)), 'finished')
Run Code Online (Sandbox Code Playgroud)
更新
注意:如果您的搜索词作为至少一个列名称的一部分 - 上面将返回所有行!为了解决这个问题 - 你需要投入更多的编码
例如,对于简单模式(没有记录或重复),这将是
#standardSQL
SELECT <columns to output>
FROM yourTable AS t
WHERE (SELECT COUNTIF(SPLIT(zzz, ':')[SAFE_OFFSET(1)] LIKE '%finished%')
FROM UNNEST(SPLIT(SUBSTR(LOWER(TO_JSON_STRING(t)),2,LENGTH(TO_JSON_STRING(t))-2))) AS zzz
) > 0
Run Code Online (Sandbox Code Playgroud)
你可以用下面的方法测试一下
#standardSQL
WITH yourTable AS (
SELECT 'a' AS x, 'b' AS y, 'c' AS col_finished UNION ALL
SELECT 'finished', '', '' UNION ALL
SELECT '', 'Bigquery Select from table where any column contains "FINISHED"','' UNION ALL
SELECT '', '', 'aaa' UNION ALL
SELECT 'finished', 'bbb', 'finished'
)
SELECT *
FROM yourTable AS t
WHERE (SELECT COUNTIF(SPLIT(zzz, ':')[SAFE_OFFSET(1)] LIKE '%finished%')
FROM UNNEST(SPLIT(SUBSTR(LOWER(TO_JSON_STRING(t)),2,LENGTH(TO_JSON_STRING(t))-2))) AS zzz
) > 0
Run Code Online (Sandbox Code Playgroud)