oracle 如何通过级别连接两个不同的长度?

qxsslcnc  于 2023-04-11  发布在  Oracle
关注(0)|答案(1)|浏览(106)

我正在尝试理解下面的查询

select
name,
country,
completePath,
regex_substr(completePath, '[^|]+', 1, lvl) parentOf
from Table
CROSS JOIN lateral
(
select LEVEL lvl from dual connect by LEVEL <= length(completePath) - length(replace(completePath, '|')) + 1)

completePath值类似于|ABC|EFG|HIG|JKL|LMN
很难理解这一点。
有没有人能帮我举个小例子?
谢谢

dfuffjeb

dfuffjeb1#

  • length(completePath)计算completePath中的字符数
  • length(replace(completePath, '|'))计算删除|字符后completePath中的字符数。
  • 因此,length(completePath) - length(replace(completePath, '|'))给出了|字符数的计数。

它所做的一切就是给你一个|分隔符的数量,这些分隔符在你的分隔字符串中分隔术语,然后通过添加1,你会得到这个分隔字符串中的最大术语数量。
例如,如果您有示例数据:

CREATE TABLE table_name (completePath) AS
  SELECT 'AB' FROM DUAL UNION ALL
  SELECT 'A|B' FROM DUAL UNION ALL
  SELECT 'A|B|C' FROM DUAL UNION ALL
  SELECT 'ABC|DEF|GHI' FROM DUAL UNION ALL
  SELECT '|ABC|DEF|G|HI' FROM DUAL;

然后:

SELECT completePath,
       length(completePath) AS num_chars,
       length(replace(completePath, '|')) AS num_chars_no_pipe,
       length(completePath) - length(replace(completePath, '|')) + 1 AS max_num_terms,
       REGEXP_COUNT(completePath, '[^|]+') AS actual_num_terms
FROM   Table_Name

输出:
| 完整路径|NUM_CHARS|NUM_CHARS_NO_PIPE|MAX_NUM_TERMS|实际数量条款|
| --------------|--------------|--------------|--------------|--------------|
| AB|二|二|1|1|
| A|B|三|二|二|二|
| A|B|C|五|三|三|三|
| ABC|DEF|GHI|十一|九|三|三|
| |ABC|DEF|G|HI|十三|九|五|四|
对于最后一个例子,在第一个字符之前可能有一个空字符串术语,因此术语的最大数量是5,即使实际上只有4个非空术语。您的正则表达式不会匹配第一个空术语,因为它只会查找长度为1或更长的匹配项;要匹配空项,您需要正则表达式[^|]*(\||$)
fiddle

相关问题