从包含字典的单元格中提取元素

时间:2018-07-13 07:16:05

标签: google-bigquery

我有一个值category:ops,client:acompany,type:sometype,正如您所看到的,它实际上是一个字典,我想提取字典键 client 的值,换句话说,我想提取<坚强的人。

这是我的做法:

select CASE WHEN INSTR(client_step1, ",") > 0 THEN SUBSTR(client_step1, 0, INSTR(client_step1, ",") - 1) 
            ELSE client_step1 
       END AS client
from (
    select CASE WHEN INSTR(dict, "client") > 0 THEN SUBSTR(dict, INSTR(dict, "client") + 7) 
                ELSE CAST(NULL as STRING) 
           END  as client_step1
    from (
        select "category:ops,client:acompany,type:sometype" as dict
        )
    )

enter image description here

,但这似乎很冗长(坦率地说,使用INSTR()SUBSTR()和派生表的组合来分割字符串感觉有点麻烦)。我想知道是否还有一种我不知道的更好的方法(我对bq相当陌生)。

预先感谢

2 个答案:

答案 0 :(得分:1)

听起来像您想要REGEXP_EXTRACT function。这是一个示例:

SELECT REGEXP_EXTRACT(dict, r'client:([^,:]+)') AS client_step1
FROM (
  SELECT "category:ops,client:acompany,type:sometype" AS dict
)

这将返回字符串acompany作为结果。正则表达式会在字符串中寻找client:,并匹配之后的所有内容,直到下一个,:或字符串末尾为止。

答案 1 :(得分:1)

解析字典(如您的字典)的另一种方法如下(对于BigQuery Standard SQL)

has_many

结果如下

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 1 id, "category:ops,client:acompany,type:sometype" AS dict
)
SELECT id,
  ARRAY(
    SELECT AS STRUCT 
      SPLIT(x, ':')[OFFSET(0)] key, 
      SPLIT(x, ':')[OFFSET(1)] value
    FROM UNNEST(SPLIT(dict)) x 
  ) items
FROM `project.dataset.table`   

正如您在这里看到的那样-您解析出所有词典项

如果您仍然只需要特定元素的值-可以在下面使用

Row id  items.key   items.value  
1   1   category    ops  
        client      acompany     
        type        sometype