我有一个值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
)
)
,但这似乎很冗长(坦率地说,使用INSTR()
,SUBSTR()
和派生表的组合来分割字符串感觉有点麻烦)。我想知道是否还有一种我不知道的更好的方法(我对bq相当陌生)。
预先感谢
答案 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