<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="cs">
	<id>http://postgres.cz/index.php?action=history&amp;feed=atom&amp;title=Array_based_functions</id>
	<title>Array based functions - Historie editací</title>
	<link rel="self" type="application/atom+xml" href="http://postgres.cz/index.php?action=history&amp;feed=atom&amp;title=Array_based_functions"/>
	<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Array_based_functions&amp;action=history"/>
	<updated>2026-05-13T23:44:12Z</updated>
	<subtitle>Historie editací této stránky</subtitle>
	<generator>MediaWiki 1.43.3</generator>
	<entry>
		<id>http://postgres.cz/index.php?title=Array_based_functions&amp;diff=476&amp;oldid=prev</id>
		<title>imported&gt;Pavel v 16. 2. 2012, 04:51</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Array_based_functions&amp;diff=476&amp;oldid=prev"/>
		<updated>2012-02-16T04:51:25Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nová stránka&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[category:Articles]]&lt;br /&gt;
* dynamic record update&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION public.setfield3(anyelement, text, text)&lt;br /&gt;
RETURNS anyelement&lt;br /&gt;
AS $body$&lt;br /&gt;
DECLARE&lt;br /&gt;
 _list text;&lt;br /&gt;
&lt;br /&gt;
BEGIN&lt;br /&gt;
_list := (&lt;br /&gt;
   SELECT string_agg(x.fld, &amp;#039;,&amp;#039;)&lt;br /&gt;
   FROM   (&lt;br /&gt;
      SELECT CASE WHEN a.attname = $2&lt;br /&gt;
              THEN quote_literal($3)&lt;br /&gt;
              ELSE quote_ident(a.attname)&lt;br /&gt;
             END AS fld&lt;br /&gt;
      FROM   pg_catalog.pg_attribute a &lt;br /&gt;
      WHERE  a.attrelid = (SELECT typrelid&lt;br /&gt;
                           FROM   pg_type&lt;br /&gt;
                           WHERE  oid = pg_typeof($1)::oid) &lt;br /&gt;
      ORDER BY a.attnum&lt;br /&gt;
   ) x&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
EXECUTE &amp;#039;&lt;br /&gt;
SELECT &amp;#039; || _list || &amp;#039;&lt;br /&gt;
FROM   (SELECT $1.*) x&amp;#039;&lt;br /&gt;
USING  $1&lt;br /&gt;
INTO   $1;&lt;br /&gt;
&lt;br /&gt;
RETURN $1;&lt;br /&gt;
END;&lt;br /&gt;
$body$ LANGUAGE plpgsql;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* array sort&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION array_sort(anyarray)&lt;br /&gt;
RETURNS anyarray AS $$&lt;br /&gt;
  SELECT ARRAY(SELECT unnest($1) ORDER BY 1)&lt;br /&gt;
$$ LANGUAGE sql;&lt;br /&gt;
&lt;br /&gt;
postgres=# select array_sort(array[1,2,34,1,2]);&lt;br /&gt;
  array_sort  &lt;br /&gt;
--------------&lt;br /&gt;
 {1,1,2,2,34}&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* remove duplicit values&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION array_distinct(anyarray)&lt;br /&gt;
RETURNS anyarray AS $$&lt;br /&gt;
  SELECT ARRAY(SELECT DISTINCT unnest($1))&lt;br /&gt;
$$ LANGUAGE sql;&lt;br /&gt;
&lt;br /&gt;
postgres=# select array_distinct(array[1,2,3,21,1,2,1]);&lt;br /&gt;
 array_distinct &lt;br /&gt;
----------------&lt;br /&gt;
 {1,2,21,3}&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* append distinct value&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION array_append_distinct(anyarray, anyelement) &lt;br /&gt;
RETURNS anyarray AS $$ &lt;br /&gt;
  SELECT ARRAY(SELECT unnest($1) union SELECT $2) &lt;br /&gt;
$$ LANGUAGE sql;&lt;br /&gt;
&lt;br /&gt;
postgres=# select array_append_distinct(array[1,2,3,4],1);&lt;br /&gt;
 array_append_distinct &lt;br /&gt;
-----------------------&lt;br /&gt;
 {1,2,3,4}&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
postgres=# select array_append_distinct(array[1,2,3,4],7);&lt;br /&gt;
 array_append_distinct &lt;br /&gt;
-----------------------&lt;br /&gt;
 {1,2,3,4,7}&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* drop value from array&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION array_erase(anyarray, anyelement) &lt;br /&gt;
RETURNS anyarray AS $$&lt;br /&gt;
  SELECT ARRAY(SELECT v FROM unnest($1) g(v) WHERE v &amp;lt;&amp;gt; $2)&lt;br /&gt;
$$ LANGUAGE sql;&lt;br /&gt;
&lt;br /&gt;
postgres=# select array_erase(array[1,2,3,2,5], 2);&lt;br /&gt;
 array_erase &lt;br /&gt;
-------------&lt;br /&gt;
 {1,3,5}&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
postgres=# select array_erase(array[1,2,3,2,5], 1);&lt;br /&gt;
 array_erase &lt;br /&gt;
-------------&lt;br /&gt;
 {2,3,2,5}&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* strict greatest&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-- standard greates&lt;br /&gt;
postgres=# select greatest(10,null,11);&lt;br /&gt;
 greatest &lt;br /&gt;
----------&lt;br /&gt;
       11&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
CREATE OR REPLACE FUNCTION greatest_strict(VARIADIC anyarray) &lt;br /&gt;
RETURNS anyelement AS $$&lt;br /&gt;
  SELECT unnest($1) &lt;br /&gt;
    ORDER BY 1 DESC NULLS FIRST &lt;br /&gt;
    LIMIT 1 &lt;br /&gt;
$$ LANGUAGE sql;&lt;br /&gt;
&lt;br /&gt;
postgres=# select greatest_strict(10,1,11); greatest_strict &lt;br /&gt;
-----------------&lt;br /&gt;
              11&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
postgres=# select greatest_strict(10,1,11, NULL);&lt;br /&gt;
 greatest_strict &lt;br /&gt;
-----------------&lt;br /&gt;
                &lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Position of item in array&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION indexof(anyarray, anyelement) &lt;br /&gt;
RETURNS int AS $$ &lt;br /&gt;
  SELECT i &lt;br /&gt;
     FROM generate_subscripts($1,1) g(i) &lt;br /&gt;
    WHERE $1[i] = $2 &lt;br /&gt;
    LIMIT 1&lt;br /&gt;
$$ LANGUAGE sql;&lt;br /&gt;
&lt;br /&gt;
postgres=# select indexof(array[1,2,3,1], 3); indexof &lt;br /&gt;
---------&lt;br /&gt;
       3&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* intersect/ of two arrays&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION array_intersect(anyarray, anyarray) &lt;br /&gt;
RETURNS anyarray AS $$&lt;br /&gt;
  SELECT ARRAY(SELECT unnest($1) &lt;br /&gt;
               INTERSECT &lt;br /&gt;
               SELECT unnest($2))&lt;br /&gt;
$$ LANGUAGE sql;&lt;br /&gt;
&lt;br /&gt;
postgres=# select array_intersect(array[1,2,3],array[2,3,4]);&lt;br /&gt;
 array_intersect &lt;br /&gt;
-----------------&lt;br /&gt;
 {2,3}&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* array subtraction&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION array_subtraction(anyarray, anyarray) &lt;br /&gt;
RETURNS anyarray AS $$&lt;br /&gt;
  SELECT ARRAY(SELECT unnest($1) &lt;br /&gt;
               EXCEPT &lt;br /&gt;
               SELECT unnest($2))&lt;br /&gt;
$$ LANGUAGE sql;&lt;br /&gt;
&lt;br /&gt;
postgres=# select array_subtraction(array[1,2,3],array[2,3,4]);&lt;br /&gt;
 array_subtraction &lt;br /&gt;
-------------------&lt;br /&gt;
 {1}&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* to_string, to_array functions - string &amp;amp;lt;-&amp;amp;gt; array functions with well NULL support&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Hello&lt;br /&gt;
&lt;br /&gt;
I like function string_to_array and array_to_string. The power of these functions is unlimited. Last week somebody noticed problems with NULLs related to string_to_array function. It is true - these function doesn&amp;#039;t handle NULL well :(.&lt;br /&gt;
&lt;br /&gt;
postgres=# SELECT string_to_array(&amp;#039;1,2,3,NULL,5&amp;#039;,&amp;#039;,&amp;#039;)::int[];&lt;br /&gt;
ERROR:  invalid input syntax for integer: &amp;quot;NULL&amp;quot;&lt;br /&gt;
&lt;br /&gt;
I would to prepare new version of these function (with better support of NULL) - functions to_array and to_string. It can be prepared for 9.1.&lt;br /&gt;
&lt;br /&gt;
CREATE OR REPLACE FUNCTION to_string(anyarray, sep text, nullstr text DEFAULT &amp;#039;&amp;#039;) &lt;br /&gt;
RETURNS text AS $$&lt;br /&gt;
SELECT array_to_string(ARRAY(SELECT coalesce(v::text, $3) &lt;br /&gt;
                                FROM unnest($1) g(v)),&lt;br /&gt;
                       $2)&lt;br /&gt;
$$ LANGUAGE sql;&lt;br /&gt;
&lt;br /&gt;
postgres=# select to_string(array[1,2,3,4,null,5],&amp;#039;,&amp;#039;); &lt;br /&gt;
 to_string  &lt;br /&gt;
------------&lt;br /&gt;
 1,2,3,4,,5&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
postgres=# select to_string(array[1,2,3,4,null,5],&amp;#039;,&amp;#039;,&amp;#039;&amp;lt;NULL&amp;gt;&amp;#039;);&lt;br /&gt;
    to_string     &lt;br /&gt;
------------------&lt;br /&gt;
 1,2,3,4,&amp;lt;NULL&amp;gt;,5&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
CREATE OR REPLACE FUNCTION to_array(text, sep text, nullstr text DEFAULT &amp;#039;&amp;#039;) &lt;br /&gt;
RETURNS text[] AS $$ &lt;br /&gt;
  SELECT ARRAY(SELECT CASE &lt;br /&gt;
                           WHEN v = $3 THEN NULL::text &lt;br /&gt;
                           ELSE v END &lt;br /&gt;
                  FROM unnest(string_to_array($1,$2)) g(v)) &lt;br /&gt;
$$ LANGUAGE sql;&lt;br /&gt;
&lt;br /&gt;
postgres=# select to_array(&amp;#039;1,2,3,4,,5&amp;#039;,&amp;#039;,&amp;#039;);&lt;br /&gt;
     to_array     &lt;br /&gt;
------------------&lt;br /&gt;
 {1,2,3,4,NULL,5}&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
postgres=# select to_array(&amp;#039;1,2,3,4,&amp;lt;NULL&amp;gt;,5&amp;#039;,&amp;#039;,&amp;#039;,&amp;#039;&amp;lt;NULL&amp;gt;&amp;#039;);&lt;br /&gt;
     to_array     &lt;br /&gt;
------------------&lt;br /&gt;
 {1,2,3,4,NULL,5}&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
postgres=# select to_array(&amp;#039;1,2,3,,5&amp;#039;,&amp;#039;,&amp;#039;)::int[];&lt;br /&gt;
    to_array    &lt;br /&gt;
----------------&lt;br /&gt;
 {1,2,3,NULL,5}&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>imported&gt;Pavel</name></author>
	</entry>
</feed>