我有两个表都有一个名为host的列。我想按主机的某个部分加入这两个表,如下所示:
select * from `config.tested` a
join `config.active` b
on REGEXP_EXTRACT(a.host, r'.*req-([a-z0-9]{12})')=REGEXP_EXTRACT(b.host, r'.*req-([a-z0-9]{12})')
还有没有更有效的方法?像USING(REGEXP_EXTRACT(host, r'.*req-([a-z0-9]{12})'))
无效
答案 0 :(得分:1)
我认为您的逻辑没问题,但是您可以使用left()
:
ON LEFT(a.host, 16) = LEFT(b.host, 16)
这包括“ reg-”以及最终字符串。
如果仍然需要确保这些值与所需的模式匹配,请添加:
WHERE REGEXP_CONTAINS(a.host, r'.*req-([a-z0-9]{12})')
答案 1 :(得分:1)
还有没有更有效的方法?
如果“更有效”是指冗长且易于阅读/维护-请尝试以下
#standardSQL
create temp function part(host string) as (
regexp_extract(host, r'.*req-([a-z0-9]{12})')
);
select *
from `config.tested` a
join `config.active` b
on part(a.host) = part(b.host)
或其变体