【问题标题】:Splitting data field String value in Oracle SQl在 Oracle SQl 中拆分数据字段字符串值
【发布时间】:2020-12-08 17:32:40
【问题描述】:

我在 Oracle SQL 表中有一个字符串字段值。是否有任何查询,以便我可以将字符串拆分为新行,每行中有一定数量的相等字符,底部有多余的字符?

eg- ABCDEFGHIJ

我希望每行字符数相等的行 4 如下

ABCD
EFGH
IJ

2 个字母的其余部分应位于底部。是否可以使用 Oracle sql 查询来实现这一点?

【问题讨论】:

    标签: sql string oracle split newline


    【解决方案1】:

    您可以根据字符串的长度使用如下查询,使用 CONNECT BY 和 LEVEL。

    WITH d AS (SELECT 'ABCDEFGHIJ' AS str FROM DUAL)
        SELECT SUBSTR (str, ((LEVEL - 1) * 4) + 1, 4)     AS four_letters
          FROM d
    CONNECT BY LEVEL < (LENGTH (str) / 4) + 1;
    

    【讨论】:

    • 这适用于单行输入,但是当您有多个行输入时,它会出错,因为分层查询无法将层次结构的一个级别与层次结构的上一层相关联,因此它将将每个新级别与前一个级别的所有行相关联,并在层次结构的每个级别产生指数级增加的重复行数。 db<>fiddle
    • @EJ Egyed 这是单行输入。如何修改此函数以拆分 36 或 72 个字符的行?
    【解决方案2】:

    如果您有多行,您可以将OUTER APPLY 与分层查询一起使用:

    SELECT s.split_value,
           s.position
    FROM   table_name t
           OUTER APPLY (
             SELECT LEVEL AS position,
                    SUBSTR( t.value, 4 * LEVEL - 3, 4 ) AS split_value
             FROM   DUAL
             CONNECT BY LEVEL <= CEIL( LENGTH( t.value ) / 4 )
           ) s
    

    其中,对于样本数据:

    CREATE TABLE table_name ( value ) AS
    SELECT 'ABCDEFGHIJ' FROM DUAL UNION ALL
    SELECT '123456789012' FROM DUAL;
    

    输出:

    分割值 |位置 :------------ | --------: ABCD | 1 EFGH | 2 IJ | 3 第1234章1 5678 | 2 9012 | 3

    db小提琴here


    更新

    如果我想在一行中有 36 个 words 个字符,我该如何修改您的第一个答案?

    SELECT s.split_value,
           s.position
    FROM   table_name t
           OUTER APPLY (
             SELECT LEVEL AS position,
                     SUBSTR( t.value, 36 * ( LEVEL - 1 ) + 1, 36 ) AS split_value
             FROM   DUAL
             CONNECT BY LEVEL <= CEIL( LENGTH( t.value ) / 36 )
           ) s
    

    其中,对于样本数据:

    CREATE TABLE table_name ( value ) AS
    SELECT 'ABCDEFGHIJ' FROM DUAL UNION ALL
    SELECT '________10________20________30________40________50________60________70________80' FROM DUAL;
    

    输出:

    分割值 |位置 :------------------------------------------------ | --------: ABCDEFGHIJ | 1 ________10________20________30______ | 1 __40________50________60________70__ | 2 ______80 | 3

    db小提琴here

    【讨论】:

    • 您好,非常感谢,如果我想在一行中有 36 个单词,我该如何修改您的第一个答案?
    • @SachiniKarunaratne 36 个单词还是 36 个字符?如果是 36 个字符,则每 4 更改为 36,将 3 更改为 35。如果是 36 个单词,那么这是一个非常不同的问题,您可能应该将其作为一个新问题提出。
    • 36 或 72 个字符 :)
    • @SachiniKarunaratne 更新
    猜你喜欢
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    • 2013-10-24
    • 1970-01-01
    • 2014-12-12
    • 2016-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多