代码之家  ›  专栏  ›  技术社区  ›  bloomingrose

显示数组与值列表匹配的行

  •  2
  • bloomingrose  · 技术社区  · 1 年前

    如果这个问题以前被问过,我很抱歉。我是SQL的新手,一直在努力寻找答案,但无济于事。

    我有一个数据集,看起来像这样:

    代码 共计
    1, 2, 3 4.
    5. 6.
    5, 7 8.

    “Codes”是一个varchar列。

    我想创建一个查询,如果“Codes”包含数组中的任何一个值,则允许我聚合“Total”。

    大致如下:

    SELECT SUM(total)
    FROM table
    WHERE (codes) = ANY('5','7')
    

    在这种情况下,SUM应该是14。

    适当的查询应该是什么?任何帮助都将不胜感激!

    2 回复  |  直到 1 年前
        1
  •  2
  •   Zegarek    1 年前

    你很接近。您可以使用字符串匹配 ~ 具有 ANY array comparison ,几乎就像你已经尝试过的那样:
    demo at db<>fiddle

    SELECT SUM(total)
    FROM test
    WHERE codes ~ ANY(array['5','7'])
    
    总和
    14

    如果 Codes 列应该包含整数数组,你可以在它的定义中反映出来:

    alter table test
      alter column codes type int[]
      using(string_to_array(codes,',')::int[]);
    

    这使它更轻,并允许您使用足够的 array operators ,如重叠 && :

    SELECT SUM(total)
    FROM test
    WHERE codes && array[5,7];
    
        2
  •  0
  •   neeru0303    1 年前

    由于代码是逗号分隔的字符串,因此最好将它们转换为数组,然后按数组列进行过滤,如下所示。

    有关更多详细信息,请参阅数组函数 https://www.postgresql.org/docs/current/functions-array.html

    with raw_data as (
        select '1,2,3' as code, 5 as total
        union all
        select '5' as code, 6 as total
        union all
        select '5,7' as code, 8 as total
        union all
        select '7' as code, 10 as total
    ),
    transformed_data as (
        select string_to_array(code, ',') as array_codes, total from raw_data
    )
    select sum(total) as sum_total
    from transformed_data
    where array_codes && array ['5', '7'];
    
    -- 24
    
    

    https://dbfiddle.uk/jffQaY0v