Google bigquery 如何取消设置存储为字符串的bigquery字段?

Google bigquery 如何取消设置存储为字符串的bigquery字段?,google-bigquery,unnest,Google Bigquery,Unnest,我试图取消显示字段,但我的查询有问题 我的表中的示例数据 '1234', '{ "id" : "123" , "items" : [ { "quantity" : 1 , "product" : { "id" : "p1" , "categories" : [ "cat1","cat2","cat3"] }}] }' 数据集中有两个字段:row_id和parts,其中parts是一个字典对象,其中包含列表项类别,但parts的数据类型是string。我希望输出是每个类别的单独一行 这是我尝试

我试图取消显示字段,但我的查询有问题

我的表中的示例数据

'1234', '{ "id" : "123" , "items" : [ { "quantity" : 1 , "product" : { "id" : "p1" , "categories" : [ "cat1","cat2","cat3"]  }}] }'
数据集中有两个字段:row_id和parts,其中parts是一个字典对象,其中包含列表项类别,但parts的数据类型是string。我希望输出是每个类别的单独一行

这是我尝试过的,但我没有得到任何结果

#standardSQL
with t as (
select "1234" as row_id, '{ "id" : "123" , "items" : [ { "quantity" : 1 , "product" : { "id" : "p1" , "categories" : [ "cat1","cat2","cat3"]  }}] }' as parts 
)
select row_id, _categories
from t,
UNNEST(REGEXP_EXTRACT_ALL(JSON_EXTRACT(parts, '$.items'), r'"categories":"(.+?)"')) _categories
预期结果

id, _categories
1234, cat1
1234, cat2
1234, cat3

下面是BigQuery标准SQL

标准SQL 以t作为 选择1234作为行_id,{id:123,项:[{quantity:1,product:{id:p1,categories:[cat1,cat2,cat3]}}作为部分 选择行id、替换类别、、 从t,UNNESTSPLITREGEXP\u提取 JSON_EXTRACTparts,“$.items”, r'类别:\[.+?]' _类别 取得了预期的效果

行id\u类别 1234第1类 2 1234第2类 3 1234 cat3 更新

上述解决方案主要集中于修复extract中使用的regexp,但没有解决具有多个产品的更一般的情况。下面的解决方案解决了这种更一般的情况

标准SQL 以t作为 选择1234作为行_id,'{id:123,项:[ {数量:1,产品:{id:p1,类别:[cat1,cat2,cat3]}, {数量:2,产品:{id:p2,类别:[cat4,cat5,cat6]} ]“作为一部分” 选择行id、替换类别、类别 从t,UNNESTREGEXP\u EXTRACT\u ALLparts,r'类别:\[.+?]'类别, 非测试类别 结果

行id类别 1234第1类 2 1234第2类 3 1234 cat3 4 1234 cat4 5 1234 cat5 6 1234 cat6
下面是BigQuery标准SQL

标准SQL 以t作为 选择1234作为行_id,{id:123,项:[{quantity:1,product:{id:p1,categories:[cat1,cat2,cat3]}}作为部分 选择行id、替换类别、、 从t,UNNESTSPLITREGEXP\u提取 JSON_EXTRACTparts,“$.items”, r'类别:\[.+?]' _类别 取得了预期的效果

行id\u类别 1234第1类 2 1234第2类 3 1234 cat3 更新

上述解决方案主要集中于修复extract中使用的regexp,但没有解决具有多个产品的更一般的情况。下面的解决方案解决了这种更一般的情况

标准SQL 以t作为 选择1234作为行_id,'{id:123,项:[ {数量:1,产品:{id:p1,类别:[cat1,cat2,cat3]}, {数量:2,产品:{id:p2,类别:[cat4,cat5,cat6]} ]“作为一部分” 选择行id、替换类别、类别 从t,UNNESTREGEXP\u EXTRACT\u ALLparts,r'类别:\[.+?]'类别, 非测试类别 结果

行id类别 1234第1类 2 1234第2类 3 1234 cat3 4 1234 cat4 5 1234 cat5 6 1234 cat6
问题是你希望在:之后没有空格,基于你的正则表达式。我在添加空格后得到了相同的结果问题是你希望在:之后没有空格,基于你的正则表达式。我在添加空格后得到了相同的结果实际上你的第二个示例就是我需要的。如何提取每个项目的数量、产品id?是否可以先取消最新项目,然后再取消最新类别?当然可以。请发布新问题,我或其他人会回答:o@mikhail实际上,你的第二个例子就是我需要的。如何提取每个项目的数量、产品id?是否可以先取消最新项目,然后再取消最新类别?当然可以。请发布新问题,我或其他人会回答:o@Mikhail