我们讨论了在case子句中使用正则表达式的最佳方法...... 我们需要对提取的对象进行大小写操作。 这可以用几种方式表达。 问题是:哪一个会更有效?如果BQ出现在多个位置,BQ会多次处理正则表达式吗?
我已经调整了我的代码以在维基百科数据样本上运行。
第一
Select case when PS_Version='1' then '1st'
when PS_Version='2' then '2nd'
when PS_Version='3' then '3rd'
else 'other' end as PS_VersionOrder
from
(SELECT regexp_extract(title,r'PlayStation (\d+)') as PS_Version
FROM [publicdata:samples.wikipedia] A
where title like '%PlayStation%'
limit 100)
第二
Select case when regexp_extract(title,r'PlayStation (\d+)')='1' then '1st'
when regexp_extract(title,r'PlayStation (\d+)')='2' then '2nd'
when regexp_extract(title,r'PlayStation (\d+)')='3' then '3rd'
else 'other' end as PS_VersionOrder
FROM [publicdata:samples.wikipedia] A
where title like '%PlayStation%'
limit 100
正则表达式人士声称第一名将更有效率。 DB男人更喜欢第二个,因为它不涉及子查询...
答案 0 :(得分:3)
我同意Alex的说法,但我会补充说,从执行的角度来看,第一个查询也会更好。 BigQuery非常有效地执行子查询,但可能不会在case子句中执行常见的子表达式消除(但是,它可能不会依赖它)。
答案 1 :(得分:2)
IMO,我会选择 1st 。
虽然第二个不包含子查询,但重复正则表达式。如果您决定稍后更改此正则表达式,则会使维护更加困难。
第二个不太可读。在理解代码之前,您必须阅读 long 冗余案例陈述。
第二和第一可能会推迟表现。您应该测量执行两个查询所需的时间。然后检查时间差异(如果存在)是否会对您的最终用户体验产生明显的影响。