【问题标题】:How to access a specific value with two separate Array with SQL (one with name and the other one with the values)如何使用两个单独的带有 SQL 的数组访问特定值(一个带有名称,另一个带有值)
【发布时间】:2021-10-11 21:53:47
【问题描述】:

我有两列如下:

names: Array(String)
['name_one','name_2','name3']

values:Array(Float64)
[1000,2000,3000]

例如,我有兴趣获取“name_2”的值。我想找回2000。 我的猜测是我应该首先确定名称中'name_2'的位置,然后使用它来检索列值中的值? 您会使用 JSON 来解决问题吗?

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

我正在使用 Clickhouse。

感谢您的帮助!

【问题讨论】:

  • 数组和 JSON 处理(历史上)不是 SQL 的基本元素,因此每个供应商都有自己的实现。请用您使用的 DBMS 标记您的问题
  • 谢谢你们俩。提供的链接帮助我解决了我的问题!

标签: sql arrays json clickhouse


【解决方案1】:

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

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 │
└────────────────────────────────────────────────┘

【讨论】:

    【解决方案2】:

    考虑使用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 │
    └────┴──────────┴────────┘
    */
    

    查看Nested Data Structures 以存储配对值。

    【讨论】:

      猜你喜欢
      • 2017-08-15
      • 2020-02-26
      • 1970-01-01
      • 2021-12-21
      • 1970-01-01
      • 2014-03-18
      • 1970-01-01
      • 2011-01-19
      • 2018-06-04
      相关资源
      最近更新 更多