你显然不应该使用这样的数据模型,因为它会带来很多麻烦。但是,如果您别无选择,那么您至少需要找到一些解决方案。
使用 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 中的单独值插入另一个表,然后执行所需的计算 - 如果您需要对该数据集执行多次计算,这将大大提高性能.