在 table 中添加逗号分隔的列值

Adding comma seperated column values in a table

我在 table 中有 2 列。

|  values_1 | values 2 |

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

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

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

使用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-clause:v1.value 和 v2.value 的值从 varchar(x) 转换为 INT 并加在一起
  • WHERE-clause: 只显示行号匹配的数据(代表需要的计算)

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

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

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 中的单独值插入另一个 table,然后执行所需的计算 - 如果您需要执行,这会大大提高性能对该数据集进行多次计算。

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

别指望这会很快。