将合并字符串的CTE函数应用于H2表中的每一行

时间:2018-08-17 09:42:32

标签: sql h2 common-table-expression

我有一个表,其中一列包含长字符串,我想将其合并为易于阅读的格式('abc;abc;abc;efg;hij;klm;klm;klm'-> 'abc: 3, efg: 1, hij: 1, klm: 3')。

我编写了一个合并字符串的函数,但是现在我想将其应用于表中的每个条目。关于如何实现这一目标的任何建议?

这是在@str中拆分和合并字符串的代码:

SET @str = 'abc;abc;abc;efg;hij;klm;klm;klm;';

WITH   cte1(token, remainder) AS (
    SELECT LEFT(@str, LOCATE(';', @str)-1) AS token, 
        RIGHT(@str, LENGTH(@str)-LOCATE(';', @str)) as remainder -- anchor member
    UNION ALL
    SELECT LEFT(remainder, LOCATE(';', remainder)-1) AS token, 
        RIGHT(remainder, LENGTH(remainder)-LOCATE(';', remainder)) as remainder -- recursive member
    FROM   cte1
    WHERE LENGTH(remainder)>0 -- terminator
), cte2 AS (
    SELECT token, count(token) AS c
    FROM cte1 
    GROUP BY token 
    HAVING LENGTH(token)>0 
    ORDER BY token
)
    SELECT GROUP_CONCAT(CONCAT_WS(': ', token, c) SEPARATOR ', ') FROM cte2 
    GROUP BY 1

第一个cte1将字符串分成单独的标记,第二个cte2创建数据透视并计算每个实例,最后的SELECT语句将结果表合并为一个字符串。

在以下设置中,如何将其应用于S1列中的每个条目,例如通过更新表并将结果添加到S2

    CREATE TABLE T1 (
ID INT, S1 VARCHAR, S2 VARCHAR);

INSERT INTO T1 
    VALUES  (1, 'abc;abc;abc;efg;hij;klm;klm;klm;', ''),
            (2, '123;123;235;235;235;987;987;123;', '');

非常感谢您的帮助!

0 个答案:

没有答案