在 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";
别指望这会很快。
我在 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";
别指望这会很快。