简而言之,我试图返回路径中所有不同的(第 3 级)条目;如果条目有 3 个斜杠。仅凭这句话就让我觉得我把这件事复杂化了,但我看不出有办法绕过这里的额外仪式。
给定“字符”表:
id | role | path
===================
0 | hero | one/two/luke
1 | hero | one/two/wicket/chak
2 | hero | one/two/wicket/den/aqi/bet
3 | grifter | one/two/han/frozen
4 | hero | one/two/leia/cgi
5 | hero | one/two/c3po/mem_wipe
预期:
检票口、莱娅、c3po
查询:
SELECT DISTINCT (STRING_TO_ARRAY(c.path,'/'))[3]
FROM character c
WHERE c.role='hero'
AND c.path IN
(SELECT path FROM character c WHERE role='hero' AND c.path like '%/%/[INPUT]/%');
我一直在想如何制定这个查询。如果我用“wicket”替换“[INPUT]”,我会得到预期的“wicket”返回,但我想要返回wicket、leia和c3po(以及其他任何东西)。
答案 0 :(得分:0)
使用split_part()
。见:
SELECT DISTINCT split_part(path, '/', 3)
FROM character
WHERE role = 'hero'
AND path LIKE '%/%/%/%';
这个 LIKE
模式需要至少 3 个斜线。但是因为%
代表LIKE
模式中的anything,所以斜杠的左右可以没有,或任意数量的附加斜杠,
对于恰好 3 个斜线,并且每个斜线的左右两侧有多个空字符串,我会使用正则表达式:
...
AND path ~ '^[^/]+/[^/]+/[^/]+/[^/]+$';
正则表达式模式的组成部分:
^
... 字符串开始
[^/]
... 带有除斜杠以外的任何字符的字符类
+
... 一个或多个原子
/
...文字斜线
...
$
... 字符串结束
或者定义您的精确过滤器。