0

问题陈述

示例如下图所示:

最后两行在单个单元格中具有类似“1.283 2 3”的模式。这些数字在列中由空格分隔。我们需要添加这些编号并以输出中给出的格式表示。

因此,必须将具有“1.283 2 3”的单元格转换为 6.283

面临的挑战:

  1. 列值采用字符串格式。
  2. 将它们转换为整数后添加 nos
  3. 不想在 UNIX 框中获取数据并对其进行操作。

在此处输入图像描述

4

1 回答 1

2

在 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

这可能会使用大量线轴,希望您不会在大桌子上运行它。

于 2013-09-30T13:24:17.833 回答