sql - 扫描列以获取值并使用结果选择其他列
问题描述
我有一个包含 30 列的 bigquery 表:
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”的号码。
示例:“strcol2”列中存在数字 1012,然后我需要使用“startstr2”和“endstr2”。我的选择语句只需要两列。结果将类似于:
start, end
scooter, boat
boat, bike
我正在考虑创建一个 strcol...strcol9 数组并尝试查找数字并返回索引,然后使用该索引找到正确的 startstr 和 endstr。但我不知道该怎么做。也许有更好的选择?有任何想法吗?
数字 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)
当应用于您问题的样本数据时 - 输出是
推荐阅读
- python - 如何按绝对值对数组编号进行排序
- python - 如何获取文本的 CSS 选择器
- sqlite - 在子查询的 group by 中使用外部查询的字段
- bash - Bash:增加 Java 属性文件中的版本号(代号一版本)
- mongodb - 如何对数组内的 JSONS 进行正则表达式查询
- python - 如何在 Tkinter 中返回当前关注的条目的长度?(以退格键为重点的条目)
- python - 为什么 elasticsearch python parallel_bulk 使用这么多内存?
- spring-boot - 如何让日志文件删除与 spring-boot-starter-log4j2 一起使用?
- java - 安卓无法删除文件
- java - Maven Archetypes 上的速度反射:从 Json 获取数据