【发布时间】:2021-11-11 14:03:36
【问题描述】:
我是第一次尝试 pgSQL。
提前非常感谢 - Eugen
我喜欢解决的问题
我喜欢从文本中返回一个具有最小长度的单词数组。选择了regexp_matches,它返回SETOF text[](不是数组)。可能有更好的方法,但这是我选择的。
regexp_matches ( string text, pattern text [, flags text ] ) → setof text[]
问题
当尝试使用来自结果集的单个结果(看似数组)时,它们实际上是 text 类型,但包含 Postgres 数组的大括号。
示例
下面的示例在功能上有效,因为我添加了一个解决方法,使用 trim 函数删除大括号。
下面描述的函数的输出
# select lower_words_arr('there is an answer','\w{3,}') AS words;
NOTICE: match = {there}
NOTICE: match = {answer}
words
----------------
{there,answer}
(1 row)
我的问题
为什么会出现,那个单独的 regexp_matches 条目匹配并以 "{txt}" 的形式返回数据,但表现为文本类型而不是 ARRAY?
有没有办法不用我的解决方法?
代码
CREATE OR REPLACE FUNCTION lower_words_arr(input_str text, match_expr text) RETURNS text[] AS $$
DECLARE
words_arr text[];
one_match text;
BEGIN
FOR one_match IN SELECT regexp_matches(lower(input_str), match_expr, 'g')
AS match
LOOP
RAISE NOTICE 'match = %', one_match;
-- But if I write:
--
-- RAISE NOTICE 'match = %', one_match[0];
--
-- fails with:
---
-- ERROR: cannot subscript type text because it is not an array
-- CONTEXT: SQL statement "SELECT one_match[0]"
-- PL/pgSQL function lower_words_arr(text,text) line 10 at RAISE
--
-- even though this the result returned
---
-- NOTICE: match = {there}
-- NOTICE: match = {answewr}
words_arr := array_append(words_arr,trim(BOTH '{}' FROM one_match));
END LOOP;
RETURN words_arr;
END;
$$ LANGUAGE plpgsql;
【问题讨论】:
-
会不会是 SELECT 这样做了?试试
FOR one_match IN regexp_matches(lower(input_str), match_expr, 'g') -
非常感谢,非常感谢您的想法,Postgres 在没有 SELECT ERROR: syntax error at or near "regexp_matches" LINE 6: FOR one_match IN regexp_matches(lower(input_str), match_. ..但我想我正在接近这个案子 - 总是很有趣。
标签: postgresql plpgsql