我需要在postgres中找到最短的字符串。到处搜索找不到任何答案。我的用例从SQL中的聚合函数开始:
select key_col, strarr_shortest(text_col) as text_col
from (
select key_col, array_agg(tex_col::text) as text_col
from mytable group by key_col
) foo;
原来,我必须写一个pl / pgsql来解决这个问题。
答案 0 :(得分:2)
无需汇总行并在数组中搜索。使用distinct on
,例如:
with mytable (key_col, text_col) as (
values
(1, 'asd'),
(1, 'a'),
(2, 'asd'),
(2, 'asdfg')
)
select distinct on (key_col) key_col, text_col as shortest
from mytable
order by key_col, length(text_col)
key_col | shortest
---------+----------
1 | a
2 | asd
(2 rows)
如果您确实需要该函数(在其他情况下使用),则它可以是包装在SQL函数中的简单查询:
create or replace function shortest(text[])
returns text language sql as $$
select elem
from unnest($1) as elem
order by length(elem)
limit 1;
$$;
答案 1 :(得分:0)
我的解决方案是创建一个新功能;不确定这是否是最佳答案。纯SQL可能有解决方案。
CREATE OR REPLACE FUNCTION strarr_shortest(arr text[]) RETURNS text AS $$
DECLARE
res text;
minlen int := 2147483647; -- largest singed int in postgres
el text;
BEGIN
FOREACH el IN ARRAY arr
LOOP
if char_length(el) < minlen then
res=el;
minlen=char_length(el);
end if;
END LOOP;
RETURN res;
END;
$$ LANGUAGE plpgsql;