如何使用两个单独的SQL数组访问特定的值(一个带有名称,另一个带有值)



我有如下两列:

names: Array(String)
['name_one','name_2','name3']
values:Array(Float64)
[1000,2000,3000]

例如,我想获得'name_2'的值。我想取回2000。我的猜测是,我应该首先确定'name_2'在名称中的位置,然后使用它来检索列值中的值?你会使用JSON找到解决方案吗?

p。我刚刚开始学习SQL,目前我只熟悉基础知识。我已经阅读了一些文档,但我在那个文档上很挣扎(总是出错)

我正在使用Clickhouse。

谢谢你的帮助!

如果您需要提取多次出现的名称

SELECT arrayFilter((x, y) -> (y = 'name_2'), values, names)
FROM
(
SELECT
1 AS id,
['name_one', 'name_2', 'name3', 'name_2'] AS names,
[1000, 2000, 3000, 4000] AS values
)
┌─arrayFilter(lambda(tuple(x, y), equals(y, 'name_2')), values, names)─┐
│ [2000,4000]                                                          │
└──────────────────────────────────────────────────────────────────────┘

如果单

SELECT values[indexOf(names, 'name_2')]
FROM
(
SELECT
1 AS id,
['name_one', 'name_2', 'name3'] AS names,
[1000, 2000, 3000] AS values
)
┌─arrayElement(values, indexOf(names, 'name_2'))─┐
│                                           2000 │
└────────────────────────────────────────────────┘

考虑使用arrayZip-function:

SELECT
arrayZip(names, values) AS zipped,
zipped[2] AS second_pair,
second_pair.1 AS second_name,
second_pair.2 AS second_value
FROM 
(
SELECT
['name_one', 'name_2', 'name3'] AS names,
[1000, 2000, 3000] AS values
)
/*
┌─zipped─────────────────────────────────────────────┬─second_pair─────┬─second_name─┬─second_value─┐
│ [('name_one',1000),('name_2',2000),('name3',3000)] │ ('name_2',2000) │ name_2      │         2000 │
└────────────────────────────────────────────────────┴─────────────────┴─────────────┴──────────────┘
*/

可能ARRAY JOIN-clause也很有用:

SELECT *
FROM 
(
SELECT
1 AS id,
['name_one', 'name_2', 'name3'] AS names,
[1000, 2000, 3000] AS values
)
ARRAY JOIN
names,
values
/*
┌─id─┬─names────┬─values─┐
│  1 │ name_one │   1000 │
│  1 │ name_2   │   2000 │
│  1 │ name3    │   3000 │
└────┴──────────┴────────┘
*/

查看嵌套数据结构来存储成对的值。

最新更新