解析表的每一行并显示不同的值sql

时间:2019-07-19 20:52:29

标签: regex google-bigquery

我正在公共dataset上工作,我需要在其中分析表帖子的每一行。因此,例如,列tags下的三行具有值:

1. <c#><.net>
2. <android> <python> <sockets> <android-studio><socket.io>
3. <android-studio><socket.io><.net>

我需要将输出显示为:

1. c#
2. .net
3. android
4. python
5. sockets
6. android-studio
7. socket.io

在BigQuery中有没有办法做到这一点?

2 个答案:

答案 0 :(得分:1)

您可以先使用REGEXP_EXTRACT_ALL来匹配<>内的所有单词,然后使用UNNEST将结果数组平整输出:

select e from (
select regexp_extract_all(x, r'<([^>]*)>') e
from unnest([
"<c#><.net>",
"<android> <python> <sockets> <android-studio><socket.io>",
"<android-studio><socket.io><.net>"
]) x), unnest(e) e

生产

Row e   
1       c#
2       .net
3       android
4       python
5       sockets
6       android-studio
7       socket.io
8       android-studio
9       socket.io
10      .net

要消除重复,请运行DISTINCT

select distinct e from (
select regexp_extract_all(x, r'<([^>]*)>') e
from unnest([
"<c#><.net>",
"<android> <python> <sockets> <android-studio><socket.io>",
"<android-studio><socket.io><.net>"
]) x), unnest(e) e

答案 1 :(得分:0)

以下是用于BigQuery标准SQL

#standardSQL
SELECT DISTINCT tag
FROM `project.dataset.table`,
UNNEST(REGEXP_EXTRACT_ALL(tags, r'<([^>]*)>')) tag

您可以使用问题中的示例数据来测试/播放上面的示例

#standardSQL
WITH `project.dataset.table` AS (
  SELECT '<c#><.net>' tags UNION ALL
  SELECT '<android> <python> <sockets> <android-studio><socket.io>' UNION ALL
  SELECT '<android-studio><socket.io><.net>'
)
SELECT DISTINCT tag
FROM `project.dataset.table`,
UNNEST(REGEXP_EXTRACT_ALL(tags, r'<([^>]*)>')) tag  

有结果

Row tag  
1   c#   
2   .net     
3   android  
4   python   
5   sockets  
6   android-studio   
7   socket.io