【问题标题】:connect by clause in regex_substrregexp_substr 中的按子句连接
【发布时间】:2013-10-12 06:45:36
【问题描述】:

我无法理解这句话 - 甚至在谷歌搜索之后也无法理解

 
pv_no_list :='23,34,45,56';
SELECT   DISTINCT REGEXP_SUBSTR (pv_no_list,
                                                     '[^,]+',
                                                     1,
                                                     LEVEL)
                                         no_list
                      FROM   DUAL
                CONNECT BY   REGEXP_SUBSTR (pv_no_list,
                                            '[^,]+',
                                            1,
                                            LEVEL) IS NOT NULL

【问题讨论】:

    标签: sql oracle oracle10g


    【解决方案1】:

    connect byregex_substr无关:

    此查询“滥用”connect by 功能在dual 的查询中生成行。 只要传递给connect by的表达式为真,就会生成新行,并增加伪列LEVEL的值。

    然后将LEVEL传递给regex_substr,在应用正则表达式时获取第n个值。

    【讨论】:

      【解决方案2】:

      connected by 的“滥用”(正如 Colin 't Hart 所说)在这里有一个很好的目的: 通过使用REGEXP_SUBSTR,您只能提取4 个匹配项之一(23、34、45、56):正则表达式[^,]+ 匹配字符串中不包含逗号的任何字符序列。

      如果你尝试跑步:

      SELECT REGEXP_SUBSTR ('23,34,45,56','[^,]+') as "token" 
      FROM   DUAL
      

      你会收到23

      如果你尝试跑步:

      SELECT REGEXP_SUBSTR ('23,34,45,56','[^,]+',1,1) as "token"
      FROM   DUAL
      

      您还会得到23,只是现在我们还设置了two additional parameters:开始查找位置 1(这是默认值),并返回第一次出现的位置。

      现在让我们运行:

      SELECT REGEXP_SUBSTR ('23,34,45,56','[^,]+',1,2) as "token"
      FROM   DUAL
      

      这一次我们将得到34(第二次出现)并使用3作为最后一个参数将返回45等等。

      使用递归 connected bylevel 可确保您收到所有相关结果(但不一定按照原始顺序!):

      SELECT DISTINCT REGEXP_SUBSTR ('23,34,45,56','[^,]+',1,LEVEL) as "token"
      FROM   DUAL
      CONNECT BY REGEXP_SUBSTR ('23,34,45,56','[^,]+',1,LEVEL) IS NOT NULL
      order by 1
      

      将返回:

      TOKEN
      23
      34
      45
      56
      

      它不仅包含所有 4 个结果,还在结果集中将其分成单独的行!

      如果您愿意 fiddle 使用它 - 它可能会让您更清楚地了解主题。

      【讨论】:

      • 次要细节,上面写着“这次我们会得到 43”,实际上是 34
      • @EduCastrillon 谢谢这是一个错字——我们这里没有 43 个;)
      • 哪个条件更适合关卡?一种。通过 REGEXP_SUBSTR ('23,34,45,56','[^,]+',1,LEVEL) 连接不为 NULL 或 b。 REGEXP_COUNT('23,34,45,56', ',')
      • @Nir Alfasi 如果我想用逗号分隔符显示在 1 行中怎么办?
      • @user2102665 现在这是一个不同的问题,我认为pivot 应该可以解决问题,但我还没有尝试过。
      【解决方案3】:
      SELECT DISTINCT REGEXP_SUBSTR ('23,34,45,56','[^,]+',1,LEVEL) as "token"
      FROM   DUAL
      CONNECT BY REGEXP_SUBSTR ('23,34,45,56','[^,]+',1,LEVEL) IS NOT NULL
      order by 1
      

      @alfasin:按 1 排序,这对我来说是个错误。 “缺少右括号” 另外,如果我跳过这个,那么当我调用 oracle 过程时,它会给出错误“ORA-22950:没有 MAP 或 ORDER 方法就无法订购对象”

      【讨论】:

        猜你喜欢
        • 2019-05-22
        • 1970-01-01
        • 1970-01-01
        • 2016-01-12
        • 2018-06-02
        • 1970-01-01
        • 1970-01-01
        • 2011-09-16
        • 2020-12-10
        相关资源
        最近更新 更多