Два шага, используя функцию SPLIT_PART
, я думаю:
а) Вертикализуйте вашу строку в ряды.
b) разделите полученные строки на двоеточие, приведите токен после двоеточия как целое число и составьте сумму этих целых чисел.
WITH
-- this is your single-row input
-- if you have many rows, you will have to add any grouping column here
input(s) AS (
SELECT 'a18: 2, b34: 5, n29: 10'
)
,
-- start real WITH clause here ...
i(i) AS (
-- create 10 "index" integers out of nothing using TIMESERIES ...
SELECT
MICROSECOND(ts) AS i
FROM ( SELECT TIMESTAMPADD(MICROSECOND, 1, '2000-01-01')
UNION ALL SELECT TIMESTAMPADD(MICROSECOND, 10, '2000-01-01')
) limits(ts_lim)
TIMESERIES ts AS '1 MICROSECOND' OVER (ORDER BY ts_lim)
)
,
-- verticalise your comma separated string
rows_obtained AS (
SELECT
TRIM(SPLIT_PART(s,',',i)) AS row_obtained
FROM input CROSS JOIN i
WHERE SPLIT_PART(s,',',i) <> '' -- remove empty strings
-- you get:
--+ row_obtained
--+ a18: 2
--+ b34: 5
--+ n29: 10
)
-- get the sum of the second part of SPLIT_PART() by colon, cast to integer
SELECT
SUM(SPLIT_PART(row_obtained,':',2)::INT) AS the_sum
FROM rows_obtained
;