我有一个要求。我想从其中一个列中提取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
如果您有任何建议,请与我们联系。
提前致谢。
答案 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