使用REGEXP_EXTRACT提取7位数字

时间:2017-11-15 14:22:07

标签: regex google-bigquery

我有一个要求。我想从其中一个列中提取7位数字,并使用另一个表查找每个7位数字的另一列,并与“|”连接。

列数据:在此需要提取7位数字。 “; 2435034; 1; 5.98 ;; eVar36 = bopis | EV2 = 2605; 1483528; 1; 17.97 ;; EV6 = bopis | evar52 = 2605; 1010203; 1; 7.98 ;; EV6 = bopis | EV2 = 2605”< / p>

输出(提取7位数字):

 2435034,1483528,1010203 

另一张表:

account name
2435034 D1
1483528 D2
1010203 D3

最终输出是(加入另一个表后):

     account_nbr        account_name
2435034|1483528|1010203  D1|D2|D3

我尝试使用以下命令提取7位数字。我只得到第一个号码,剩下的号码不会来。

REGEXP_EXTRACT(REGEXP_REPLACE(";2435034;1;5.98;;eVar36=bopis|ev2=2605,;1483528;1;17.97;;ev6=bopis|evar52=2605,;1010203;1;7.98;;ev6=bopis|ev2=2605", r'[^\d]+', ','),r'[0-9]+')

这可能很简单,但无法弄清楚。尝试使用GROUP_CONCAT和SPLIT函数也会出现以下错误。

Exactly one capturing group must be specified

如果您有任何建议,请与我们联系。

提前致谢。

1 个答案:

答案 0 :(得分:2)

以下是BigQuery Standard SQL

  
<script>
    function allowDrop(ev) {
        ev.preventDefault();
    }

    function drag(ev) {
        ev.dataTransfer.setData("text", ev.target.id);
    }

    function drop(ev) {
        ev.preventDefault();
        var data = ev.dataTransfer.getData("text");
        ev.target.appendChild(document.getElementById(data));
    }
</script>

您可以使用问题中的虚拟数据进行测试/播放:

#standardSQL
SELECT 
  STRING_AGG(nbr, '|' ORDER BY pos) account_nbr,
  STRING_AGG(name, '|' ORDER BY pos) account_name,  
  data
FROM `project.dataset.yourTable` t, 
UNNEST(REGEXP_EXTRACT_ALL(REGEXP_REPLACE(t.data, r'[^\d]+', ','),r'[0-9]{7}')) nbr WITH OFFSET pos
JOIN `project.dataset.anotherTable` x
ON CAST(x.account AS STRING) = nbr
GROUP BY data
  

评论中的新问题更新:如果t.data为空,则会过滤记录。是否有一种方法可以获得记录,即使t.data为空?在我的表中,一些记录没有t.data

的值
#standardSQL
WITH `project.dataset.yourTable` AS (
  SELECT ";2435034;1;5.98;;eVar36=bopis|ev2=2605,;1483528;1;17.97;;ev6=bopis|evar52=2605,;1010203;1;7.98;;ev6=bopis|ev2=2605" data
), `project.dataset.anotherTable` AS (
  SELECT 2435034 account, 'D1' name UNION ALL
  SELECT 1483528, 'D2' UNION ALL
  SELECT 1010203, 'D3' 
)
SELECT 
  STRING_AGG(nbr, '|' ORDER BY pos) account_nbr,
  STRING_AGG(name, '|' ORDER BY pos) account_name,  
  data
FROM `project.dataset.yourTable` t, 
UNNEST(REGEXP_EXTRACT_ALL(REGEXP_REPLACE(t.data, r'[^\d]+', ','),r'[0-9]{7}')) nbr WITH OFFSET pos
JOIN `project.dataset.anotherTable` x
ON CAST(x.account AS STRING) = nbr
GROUP BY data