【问题标题】:Adding comma seperated column values in a table在表中添加逗号分隔的列值
【发布时间】:2021-06-03 11:55:01
【问题描述】:

我在一个表中有 2 列。

|  values_1 | values 2 |

| 1,2,3,4   | 5,6,7,8  |

我需要添加两个列值..即结果应该是 6,8,10,12

【问题讨论】:

  • 您可以通过修复数据模型来做到这一点。数字不应存储为字符串。不应对字符串值执行算术运算。字符串列不应包含多个值。修复你的数据模型!
  • 你真的存储了逗号分隔的值,还是只是表现不佳?
  • 从外观上看,您已经为这个数据模型苦苦挣扎了一段时间! stackoverflow.com/questions/65845676/…
  • 逗号分隔的项目不过是询问SQL问题...
  • Deepa Das - 如果此问题的答案之一解决了您的问题,您可以通过将其标记为已接受来帮助社区。接受的答案有助于未来的访问者自信地使用该解决方案。 :-)

标签: sql multiple-columns add


【解决方案1】:

你显然不应该使用这样的数据模型,因为它会带来很多麻烦。但是,如果您别无选择,那么您至少需要找到一些解决方案。

使用 MSSQL,您可以执行以下查询以获得您想要的结果:

SELECT a.id, a.values_1, a.values_2, v1.rowindex_left, v2.rowindex_right, v1.value as lefty, v2.value as righty, CAST(v1.value AS INT)+CAST(v2.value AS INT) as result 
    FROM testtable a
        CROSS APPLY (select value, ROW_NUMBER() OVER(ORDER BY value ASC) AS rowindex_left from string_split(values_1, ',')) as v1
        CROSS APPLY (select value, ROW_NUMBER() OVER(ORDER BY value ASC) AS rowindex_right from string_split(values_2, ',')) as v2
        where v1.rowindex_left = v2.rowindex_right

基础:

结果:

它的作用:

  • 它会转换您的数据(通过使用 string_split),以便您可以使用每个值进行进一步计算
  • SELECT 子句:v1.value 和 v2.value 的值从 varchar(x) 转换为 INT 并相加
  • WHERE 子句:仅显示行号匹配的数据(以表示所需的计算)

您始终需要先准备数据,然后才能使用单独的值进行计算。

现在,我们可以执行以下语句,将分隔值放在一起:

SELECT id, STRING_AGG(result, ',') from (
    SELECT a.id, a.values_1, a.values_2, v1.rowindex_left, v2.rowindex_right, v1.value as lefty, v2.value as righty, CAST(v1.value AS INT)+CAST(v2.value AS INT) as result 
    FROM testtable a
        CROSS APPLY (select value, ROW_NUMBER() OVER(ORDER BY value ASC) AS rowindex_left from string_split(values_1, ',')) as v1
        CROSS APPLY (select value, ROW_NUMBER() OVER(ORDER BY value ASC) AS rowindex_right from string_split(values_2, ',')) as v2
        where v1.rowindex_left = v2.rowindex_right 
    ) t group by id

之后,您应该会得到以下结果:

如果您有大量数据,您可以将 v1+v2 中的单独值插入另一个表,然后执行所需的计算 - 如果您需要对该数据集执行多次计算,这将大大提高性能.

【讨论】:

    【解决方案2】:

    在 PostgreSQL 中,您可以将字符串拆分为表 (regexp_split_to_table)。之后,您可以将表粘贴到源表 (from rows from) 的列中。您必须保持正确的顺序 (with ordinality)。然后您可以将这两个值转换为整数后相加 (::int)。为了将求和后的值转换回数组,您必须按原始值 (group by) 对它们进行分组。然后,您可以在保持原始顺序 (order by ordinality) 的同时将求和值聚合到一个数组 (array_agg) 中。接下来,您可以将数组格式化为字符串 (array_to_string)。

    示例 (SQL Fiddle):

    -- table
    create table "values"
    (
      "values 1" text,
      "values 2" text
    );
    
    -- data
    insert into "values" values ('1,2,3,4', '5,6,7,8');
    insert into "values" values ('11,22,33,44', '55,66,77,88');
    
    -- select
    select
      "values 1", "values 2",
      array_to_string(array_agg (s order by ordinality), ',') "values 1+2"
    from
      (select
         "values 1", "values 2", ordinality,
         v1::int + v2::int s
       from
         "values",
         rows from
         (regexp_split_to_table ("values 1", ','),
          regexp_split_to_table ("values 2", ','))
         with ordinality alias (v1, v2)) tmp
    group by "values 1", "values 2";
    

    不要指望这会很快。

    【讨论】:

      猜你喜欢
      • 2021-11-30
      • 1970-01-01
      • 2016-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-13
      相关资源
      最近更新 更多