查询 STRING_TO_ARRAY 返回的项目

时间:2021-01-19 00:13:40

标签: sql string postgresql split

简而言之,我试图返回路径中所有不同的(第 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(以及其他任何东西)。

1 个答案:

答案 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 ~ '^[^/]+/[^/]+/[^/]+/[^/]+$';

正则表达式模式的组成部分:

^ ... 字符串开始
[^/] ... 带有除斜杠以外的任何字符的字符类
+ ... 一个或多个原子
/ ...文字斜线
...
$ ... 字符串结束

或者定义您的精确过滤器。

相关问题