Sql 扫描列以查找值,并使用结果选择其他列
我有一个包含30列的bigquery表:Sql 扫描列以查找值,并使用结果选择其他列,sql,google-bigquery,Sql,Google Bigquery,我有一个包含30列的bigquery表: strcol,strcol1,strcol2,.. startstr, startstr1, startstr2,.. endstr, endstr1, endstr2,.. 1111, 2343, 1012...... "car", "boat", "scooter"..... "plane", "bike", "bo
strcol,strcol1,strcol2,.. startstr, startstr1, startstr2,.. endstr, endstr1, endstr2,..
1111, 2343, 1012...... "car", "boat", "scooter"..... "plane", "bike", "boat"
9999, 1012, 3333...... "scooter", "boat", "scooter"..... "boat", "bike", "boat"
我需要扫描所有列“strcol”以找到一个数字。如果我找到了号码,我需要使用对应的“startstr”和“endstr”
例如:
数字1012出现在列“strcol2”中,然后我需要使用“startstr2”和“endstr2”。我的select语句只需要两列。结果可能是:
start, end
scooter, boat
boat, bike
我正在考虑创建一个strcol数组…strcol9,并尝试查找数字并返回索引,然后使用此索引查找正确的startstr和endstr。但我不知道怎么做。也许有更好的选择?有什么想法吗
1012这个数字永远是固定不变的
干杯,
下面的Cris是针对BigQuery标准SQL的
#standardSQL
select start, `end`
from (
select
max(if(key='strcol', value, null)) as strcol,
cast(max(if(key='strcol', value, null)) as int64) as value,
max(if(key='startstr', value, null)) as start,
max(if(key='endstr', value, null)) as `end`
from (
select format('%t', t) id,
regexp_extract(col, r'^[^\d]+') key,
regexp_extract(col, r'[\d]*$') offset,
value
from `project.dataset.table` t,
unnest(split(translate(to_json_string(t), '{}"', ''))) as kv,
unnest([struct(split(kv, ':')[offset(0)] as col, split(kv, ':')[offset(1)] as value)])
)
group by id, offset
)
where value = 1012
如果要应用于问题中的样本数据,则输出为
下面是BigQuery标准SQL,可能看起来不太“高级/详细”,因此您可能很容易处理/维护
#standardSQL
select
regexp_extract(line, r'"startstr' || pattern) start,
regexp_extract(line, r'"endstr' || pattern) `end`,
from `project.dataset.table` t,
unnest([to_json_string(t)]) line,
unnest(generate_array(0, array_length(split(line))/3 - 1)) index,
unnest([if(index > 0, cast(index as string), '') || '":"?([^,"]+)"?']) pattern
where regexp_extract(line, r'"strcol' || pattern) = cast(1012 as string)
当应用于问题中的样本数据时-输出为
提供输入数据样本和预期结果样本。不需要在所有的30栏-只有少数几栏可以让我们了解你到底需要什么好添加一些更多的信息。感谢您的回复,但我需要知道strcol的后缀,以便知道在startstr和endstr中使用什么后缀。
那么可能吧?是的,这是一个很好的选择……但是……在我的示例中,我有10个strcol,但实际上我有34个:(所以我想做点别的……但你是对的,这将是我的b计划。谢谢Sergey。如果没有其他解决方案,我会将此标记为答案。@Cristian……这不是你想要的结果。这回答了你所问的问题。如果你想要的真的不同,我建议你问一个新问题。好的,我会问一个新问题。将此标记为答案。抱歉,米哈伊尔,它超级高级:D lol我在电话上,我的微笑没有成功…@Cristian-如果上面的答案对你来说太高级了-请查看我刚刚发布的另一个选项作为新答案。它可能仍然看起来高级-但我认为不太冗长,也不容易接受。但总体上-你的问题n就是这样,简单的答案不会飞起来!:o)这实际上让我走上了正确的方向,通过对我的数据进行一些调整,我让它工作起来了。谢谢米哈伊尔!太好了。很高兴它为你工作了:o)我知道这一个比我的第一个答案更容易管理和调整,以适应更具体的需求-更容易
#standardSQL
select
regexp_extract(line, r'"startstr' || pattern) start,
regexp_extract(line, r'"endstr' || pattern) `end`,
from `project.dataset.table` t,
unnest([to_json_string(t)]) line,
unnest(generate_array(0, array_length(split(line))/3 - 1)) index,
unnest([if(index > 0, cast(index as string), '') || '":"?([^,"]+)"?']) pattern
where regexp_extract(line, r'"strcol' || pattern) = cast(1012 as string)