我正在尝试理解下面的查询
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
很难理解这一点。
有没有人能帮我举个小例子?
谢谢
1条答案
按热度按时间dfuffjeb1#
length(completePath)
计算completePath
中的字符数length(replace(completePath, '|'))
计算删除|
字符后completePath
中的字符数。length(completePath) - length(replace(completePath, '|'))
给出了|
字符数的计数。它所做的一切就是给你一个
|
分隔符的数量,这些分隔符在你的分隔字符串中分隔术语,然后通过添加1
,你会得到这个分隔字符串中的最大术语数量。例如,如果您有示例数据:
然后:
输出:
| 完整路径|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