在postgresql中,我需要提取给定列的值中的前两个单词.因此,如果价值是"hello world moon and stars"或"hello world moon",或者甚至只是"hello world",我需要"hello world".
我希望使用,regexp_split_to_array
但似乎我不能使用它并访问在同一查询中返回的元素?
我是否需要为我正在尝试的内容创建一个函数?
VGe*_*rge 10
我无法相信5年前,如果用括号括起来,没有人注意到你可以访问regexp_split_to_array函数中的元素.
我看到很多人试图像这样访问表的元素:
select regexp_split_to_array(my_field, E'my_pattern')[1] from my_table
Run Code Online (Sandbox Code Playgroud)
前一个将返回错误,但以下不会:
select (regexp_split_to_array(my_field, E'my_pattern'))[1] from my_table
Run Code Online (Sandbox Code Playgroud)
你可以在PostgreSQL中使用POSIX正则表达式substring()
:
select substring('hello world moon' from E'^\\w+\\s+\\w+');
Run Code Online (Sandbox Code Playgroud)
或者对一个单词的含义进行非常自由的解释:
select substring('it''s a nice day' from E'^\\S+\\s+\\S+');
Run Code Online (Sandbox Code Playgroud)
注意\S
(非空格)而不是\w
("单词"字符,基本上是字母数字加上下划线).
不要忘记所有额外的引用废话:
E''
告诉你使用PostgreSQL 扩展逃逸.如果你真的想使用regexp_split_to_array
,那么你可以,但上述引用问题适用,我认为你只想切掉数组的前两个元素:
select (regexp_split_to_array('hello world moon', E'\\s+'))[1:2];
Run Code Online (Sandbox Code Playgroud)
我猜测逃跑造成了一些混乱; 我通常最后添加反斜杠直到它工作,然后我挑选它,直到我理解为什么我需要我最终使用的反斜杠的数量.或许额外的括号和数组切片语法是一个问题(这对我而言,但一些实验将其整理出来).
找到了一个答案:
select split_part('hello world moon', ' ', 1) || ' ' || split_part('hello world moon', ' ', 2);
Run Code Online (Sandbox Code Playgroud)