在postgres中如何找到最短的字符串数组

时间:2019-01-19 18:20:21

标签: sql postgresql

我需要在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来解决这个问题。

2 个答案:

答案 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;