【问题标题】:Oracle Query for extracting comma separated values用于提取逗号分隔值的 Oracle Query
【发布时间】:2020-06-10 08:32:17
【问题描述】:

我有一个要求,我得到一个带有逗号分隔值的字符串,我必须提取这些值和过程。我使用了下面的查询,一切正常,但是当我在该字符串中的所有空值都由 , 分隔时,它失败了。

SELECT regexp_substr(i_child_sal_acc_det, '[^,]+', 1, LEVEL)
  BULK COLLECT INTO v_sal_acc_det_list
  FROM dual
CONNECT BY regexp_substr(i_child_sal_acc_det, '[^,]+', 1, LEVEL)
IS NOT NULL.

上述查询返回 4 条记录用于输入 'A,B,C,D',但仅返回 1 条记录用于 ',,,' 和 2 条记录用于输入 ',C,D,'。

我想要的是获取逗号之间的值,即使它是 NULL,它们最多可以传递一个字符串中的 9 个值。

你能帮忙吗?

【问题讨论】:

    标签: sql regex oracle csv


    【解决方案1】:

    问题出在递归查询的退出条件中,一旦遇到空项就停止。您可以更改它以根据字符串中的实际逗号数检查迭代索引:

    SELECT regexp_substr(i_child_sal_acc_det, '[^,]*', 1, LEVEL)
    BULK COLLECT INTO v_sal_acc_det_list
    FROM dual
    CONNECT BY LEVEL <= REGEXP_COUNT(i_child_sal_acc_det, ',') + 1
    

    请注意,我将正则表达式的量词从 + 更改为 *,因此它允许空字符串。

    如果要将迭代次数限制为9,即使CSV字符串中有更多项:

    CONNECT BY LEVEL <= LEAST(REGEXP_COUNT(i_child_sal_acc_det, ',') + 1, 9)
    

    【讨论】:

      【解决方案2】:

      如果您可以访问 Oracle apex_string 软件包,您可以这样做:

      SELECT column_value
        BULK COLLECT INTO v_sal_acc_det_list
        FROM apex_string.split (i_child_sal_acc_det, ',');
      

      【讨论】:

      • 我无权访问此软件包,但谢谢 Tony。
      猜你喜欢
      • 1970-01-01
      • 2013-02-23
      • 1970-01-01
      • 2017-07-04
      • 1970-01-01
      • 2015-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多