问题陈述
示例如下图所示:
最后两行在单个单元格中具有类似“1.283 2 3”的模式。这些数字在列中由空格分隔。我们需要添加这些编号并以输出中给出的格式表示。
因此,必须将具有“1.283 2 3”的单元格转换为 6.283
面临的挑战:
- 列值采用字符串格式。
- 将它们转换为整数后添加 nos
- 不想在 UNIX 框中获取数据并对其进行操作。
在 TD14 中,在您需要实现自己的 UDF 或使用递归查询之前,将有一个名为 STRTOK_SPLIT_TO_TABLE 的内置表 UDF。
我修改了现有的字符串拆分脚本以使用空格作为分隔符:
CREATE VOLATILE TABLE Strings
(
groupcol INT NOT NULL,
string VARCHAR(991) NOT NULL
) ON COMMIT PRESERVE ROWS;
INSERT INTO Strings VALUES (1,'71.792');
INSERT INTO Strings VALUES (2,'71.792 1 2');
INSERT INTO Strings VALUES (3,'1.283 2 3');
WITH RECURSIVE cte
(groupcol,
--string,
len,
remaining,
word,
pos
) AS (
SELECT
GroupCol,
--String,
POSITION(' ' IN String || ' ') - 1 AS len,
TRIM(LEADING FROM SUBSTRING(String || ' ' FROM len + 2)) AS remaining,
TRIM(SUBSTRING(String FROM 1 FOR len)) AS word,
1
FROM strings
UNION ALL
SELECT
GroupCol,
--String,
POSITION(' ' IN remaining)- 1 AS len_new,
TRIM(LEADING FROM SUBSTRING(remaining FROM len_new + 2)),
TRIM(SUBSTRING(remaining FROM 1 FOR len_new)),
pos + 1
FROM cte
WHERE remaining <> ''
)
SELECT
groupcol,
-- remove the NULLIF to get 0 for blank strings
SUM(CAST(NULLIF(word, '') AS DECIMAL(18,3)))
FROM cte
GROUP BY 1
这可能会使用大量线轴,希望您不会在大桌子上运行它。