如何从bigquery中的字符串中提取子集

时间:2017-03-06 15:02:02

标签: sql regex google-bigquery

我有一个由4个部分组成的字符串变量,看起来像这样:

social_CA_FR_bloom_build

或者这个:

 social_DE_bloom_trgj4_67

(以及不同的变体)。

我如何在BigQuery中编写正则表达式以提取子集,以便我可以构建包含第一部分(社交),第二部分(CA_FR or DE etc),第三部分(bloom)和第四部分(t {{ 1}})?

我已经尝试过这个:

rgj4_67 or build, etc

在SQL(配置单元)中工作,但在BQ中不能工作,因为它不能识别(字符串,字符串,整数)。

我正在考虑用连字符替换CA_FR之间的下划线(它应该保持在一起并且只发生在几行中,通常它只是两个大写),然后在字符串上使用SPLIT而不是regex_extract,但我不确定如何解决此问题/如果这是解决方案。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

一个想法是应用正则表达式,然后使用SPLIT。例如:

#standardSQL
SELECT
  parts[SAFE_OFFSET(0)] AS social,
  parts[SAFE_OFFSET(1)] AS language,
  parts[SAFE_OFFSET(2)] AS bloom,
  parts[SAFE_OFFSET(3)] AS build
FROM (
  SELECT
    SPLIT(REGEXP_REPLACE(
            label,
            r'([^_]+)_([A-Z]{2}[_A-Z]*)_([^_]+)_(.+)',
            r'\1|\2|\3|\4'),
          '|') AS parts
  FROM YourTable
);

我编写了列名 - 您可以使用您想要的任何名称。作为一个独立的例子:

#standardSQL
WITH YourTable AS (
  SELECT 'social_CA_FR_bloom_build' AS label UNION ALL
  SELECT 'social_DE_bloom_trgj4_67' AS label
)
SELECT
  parts[SAFE_OFFSET(0)] AS social,
  parts[SAFE_OFFSET(1)] AS language,
  parts[SAFE_OFFSET(2)] AS bloom,
  parts[SAFE_OFFSET(3)] AS build
FROM (
  SELECT
    SPLIT(REGEXP_REPLACE(
            label,
            r'([^_]+)_([A-Z]{2}[_A-Z]*)_([^_]+)_(.+)',
            r'\1|\2|\3|\4'),
          '|') AS parts
  FROM YourTable
);