你可以通过检查
USERID
符合
.
后面跟一些数字,后面跟一个
.
作为整个字符串(使用regex
'^\\.[0-9]+\\.$'
)如果是,返回
-
;如果不是,则生成
用户ID
直至(包括倒数第二个
.
):
SELECT
CASE WHEN USERID REGEXP '^\\.[0-9]+\\.$' THEN '-'
ELSE SUBSTRING(USERID, 1, LENGTH(USERID) - LOCATE('.', SUBSTRING(REVERSE(USERID), 2)))
END AS PARENT,
USERID,
NAME
FROM user
输出:
PARENT USERID NAME
- .1. A
.1. .1.1. B
.1. .1.2. C
.1.2. .1.2.1. D
- .2. E
.2. .2.1. F
.2.1. .2.1.1. G
.2.1.1. .2.1.1.1. H
- .3. I
.3. .3.1. J
Demo on dbfiddle
同时获得
NAME
的
PARENT
,我们
LEFT JOIN
以上结果返回到
user
上的桌子
起源
价值:
SELECT u.*, COALESCE(p.NAME, '-') AS PARENTNAME
FROM (
SELECT
CASE WHEN USERID REGEXP '^\\.[0-9]+\\.$' THEN '-'
ELSE SUBSTRING(USERID, 1, LENGTH(USERID) - LOCATE('.', SUBSTRING(REVERSE(USERID), 2)))
END AS PARENT,
USERID,
NAME
FROM user
) u
LEFT JOIN user p ON p.USERID = u.PARENT
ORDER BY USERID
输出
PARENT USERID NAME PARENTNAME
- .1. A -
.1. .1.1. B A
.1. .1.2. C A
.1.2. .1.2.1. D C
- .2. E -
.2. .2.1. F E
.2.1. .2.1.1. G F
.2.1.1. .2.1.1.1. H G
- .3. I -
.3. .3.1. J I
Demo on dbfiddle