我有以下常見形式的路徑名(路徑深度不受限制):
/a/b/c/d/e/...
例子
/a/b/c/d/e
預期結果
我現在想要實作的是將路徑拆分為包含檔案夾和相應父級的表:
| 父母 | 檔案夾 |
|---|---|
| /A B C D/ | e |
| /a/b/c/ | d |
| /a/b/ | C |
| /一種/ | b |
| / | 一種 |
在拆分字串時,H2 db 的功能有點受限,因此我的假設是它必須遞回解決(特別是因為路徑深度不受限制)。
任何幫助,將不勝感激 :)
uj5u.com熱心網友回復:
您需要使用遞回查詢,例如:
WITH RECURSIVE CTE(S, F, T) AS (
SELECT '/a/b/c/d/e', 0, 1
UNION ALL
SELECT S, T, LOCATE('/', S, T 1)
FROM CTE
WHERE T <> 0
)
SELECT
SUBSTRING(S FROM 1 FOR F) PARENT,
SUBSTRING(S FROM F 1 FOR
CASE T WHEN 0 THEN CHARACTER_LENGTH(S) ELSE T - F - 1 END) FOLDER
FROM CTE WHERE F > 0;
它產生
| 家長 | 檔案夾 |
|---|---|
| / | 一種 |
| /一種/ | b |
| /a/b/ | C |
| /a/b/c/ | d |
| /A B C D/ | e |
uj5u.com熱心網友回復:
做這樣的事情:
with recursive
p(p) as (select '/a/b/c/d/e' as p),
t(path, parent, folder, i) as (
select
p,
REGEXP_REPLACE(p, '(.*)/\w ', '$1'),
REGEXP_REPLACE(p, '.*/(\w )', '$1'),
1
from p
union
select
t.parent,
REGEXP_REPLACE(t.parent, '(.*)/\w ', '$1'),
REGEXP_REPLACE(t.parent, '.*/(\w )', '$1'),
t.i 1
from t
where t.parent != ''
)
select *
from t;
導致
|PATH |PARENT |FOLDER|I |
|----------|--------|------|---|
|/a/b/c/d/e|/a/b/c/d|e |1 |
|/a/b/c/d |/a/b/c |d |2 |
|/a/b/c |/a/b |c |3 |
|/a/b |/a |b |4 |
|/a | |a |5 |
不確定您是否真的對尾隨/字符感興趣,但您可以根據需要輕松修復查詢。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/476570.html
