如何在 BQ 中拥有具有多个结果值的多个 IF 语句?

How can i have Multiple IF Statements with multiple result value in BQ?

提问人:Zahra Safdari 提问时间:7/14/2023 最后编辑:Zahra Safdari 更新时间:7/14/2023 访问量:36

问:

我有一个BQ问题,感谢您的帮助。

我有以下字段:类别

其中包含不同的值。附照片

我需要解开它并捕捉其中的价值,这对我来说似乎是一项复杂的任务。

逻辑是,如果类别标签的长度为 0(我假设它类似于附加的第一行图片,然后将其称为 parent='archaeology';ARRAY_LENGTH(SPLIT(category_tags, '|')) = 0

如果长度为 ARRAY_LENGTH(SPLIT(category_tags, '|')) = 1(与第二行一样),则第一个字符将是字符,第二个字符将是字符。( child='geology', parent='planet earth')

如果长度类似于第 3 行,则应为 .(grandchild='alligator' would be 0 offset , parent='Animals' which is the 1 offset, child='reptiles' which is 2 offset)

最后,如果长度类似于 7 行,有 4 个值,它应该类似于 .(greatgrandchild='orcas' which is 0 offset, parent='Animals' which is the 1 offset, child='marrine mammal' which is 2 offset, grandchild='dolphines' would be 3 offset)

**用最简单的解释:

1 word  = parent
and 12 = child/parent
and 123 = grandchild/parent/child
and 1234 = greatgrandchild/parent/child/grandchild.**

因此,我需要将其记录为category_type(父母/孩子/孙子/曾孙)和可以包含值的Category_name。像这样的东西:附上图片。

谁能为此帮助 BQ 代码?提前致谢。

category desiredoutput

我已经尝试了评论中提到的查询,结果是:它没有获取任何其他category_type:test of a test query which was shared in the comments

sql if-statement google-bigquery 拆分 案例

评论


答:

0赞 Mikhail Berlyant 7/14/2023 #1

请考虑以下方法(BigQuery 标准 SQL)

SELECT SPLIT(category_tag, '/')[OFFSET(0)] category_name, 
  ['', 'Parent', 'Child', 'Grandchild', 'Greatgrandchild'][OFFSET(ARRAY_LENGTH(SPLIT(category_tag, '/')))] AS category_type,
  '/' || REGEXP_REPLACE(category_tag, r'^([^/]+)(/)(.*)', r'\3\2\1') AS category 
FROM your_table    

如果应用于示例数据,如您的问题

WITH your_table AS (
  SELECT 'archeology' category_tag UNION ALL
  SELECT 'geology/planet earth' UNION ALL
  SELECT 'the moon/space/astronomy' UNION ALL
  SELECT 'orcas/animals/marine mammals/dolphins' 
)

输出是

enter image description here

如果用作分隔符 - 请改用下面|

SELECT SPLIT(category_tag,'|')[OFFSET(0)] category_name, 
  ['', 'Parent', 'Child', 'Grandchild', 'Greatgrandchild'][OFFSET(ARRAY_LENGTH(SPLIT(category_tag, '|')))] AS category_type,
  '/' || REGEXP_REPLACE(REPLACE(category_tag, '|', '/'), r'^([^/]+)(/)(.*)', r'\3\2\1') AS category 
FROM your_table

评论

0赞 Zahra Safdari 7/14/2023
非常感谢。但是当我应用它时,它不会拿起孩子/孙子和曾孙。它只接父母。我可以在此页面中添加输出的屏幕截图
0赞 Mikhail Berlyant 7/14/2023
您是否尝试过在我的答案中使用示例数据?您是在使用还是在您的真实数据中?/|
0赞 Zahra Safdari 7/14/2023
是的,它适用于示例数据,但在我使用的真实数据中.我明白为什么它令人困惑,category_tag有一个分离器。我添加了输出的屏幕截图,category_tag也在那里。||
0赞 Mikhail Berlyant 7/14/2023
请参阅更新。非常小。
1赞 Zahra Safdari 7/14/2023
当然谢谢。非常欣赏它