User Tools

Site Tools


postgresqlfunctions

SQL and PL/pgSQL

JSON

Arrays

Arrays can be displayed as ARRAY[1,2,3] or {1,2,3}.

Operators

SELECT 1 WHERE 'ian' = ANY(ARRAY['ian','bob']); --True
SELECT 1 WHERE 'ian' = ALL(ARRAY['ian','bob']); --False
-- Does each element appearing in the 2nd array equal some element of the 1st array
SELECT ARRAY[1,2,3] @> ARRAY[1,3];              --True
SELECT ARRAY[1,2,3] @> ARRAY[1,3,4];            --False
-- Does each element appearing in the 1st array equal some element of the 2nd array
SELECT ARRAY[1,3] <@ ARRAY[1,2,3];              --True
SELECT ARRAY[1,3,4] <@ ARRAY[1,2,3];            --False
-- Do the arrays have any elements in common.
SELECT ARRAY[1,2,3] && ARRAY[3,4];              --True
SELECT ARRAY[1,2,3] && ARRAY[4,5];              --False

Append / Prepend

SELECT ARRAY[1,2,3] || 4;
SELECT array_append(ARRAY[1,2,3], 4);
 
SELECT 0 || ARRAY[1,2,3];
SELECT array_prepend(0, ARRAY[1,2,3]);

Replace / Remove

SELECT array_replace(ARRAY[1,2,4], 4, 3);
SELECT array_remove(ARRAY[1,2,3,4], 4);

Concatenate

SELECT ARRAY[1,2,3] || 4;
SELECT 0 || ARRAY[1,2,3];
SELECT array_cat(ARRAY[0], ARRAY[1,2.3]);

Length

SELECT array_length(ARRAY[1,2,3], 1);
SELECT cardinality(ARRAY[1,2,3]);

Position

SELECT array_position(ARRAY[1,2,3], 2);
SELECT array_positions(ARRAY[1,2,2,3], 2);

Conversion

SELECT array_to_string(ARRAY[1,2,3], ',');         -- Returns 1 row (1,2,3)
SELECT unnest(ARRAY[1,2,3]);                       -- Returns 3 rows
SELECT generate_subscripts(ARRAY['A','B','C'], 1); -- Returns 3 rows
 
--Convert text column with comma separated values to array
ALTER TABLE name_basics ALTER primaryprofession TYPE text[] 
                        USING string_to_array(primaryprofession, ','); 

Hierarchical Data

WITH RECURSIVE t1(n) AS (
  VALUES (0)
  UNION ALL
  SELECT n+1 FROM t1 WHERE n < 5)
SELECT * FROM t1;
CREATE TABLE family (KEY INT, parent_key INT, name text);
INSERT INTO family VALUES (1, NULL, 'Grandad');
INSERT INTO family VALUES (2, 1, 'Dad');
INSERT INTO family VALUES (3, 2, 'Tracy');
INSERT INTO family VALUES (4, 2, 'Ian');
INSERT INTO family VALUES (5, 3, 'Michaela');
INSERT INTO family VALUES (6, 3, 'Joshua');
INSERT INTO family VALUES (7, 5, 'Freya');
INSERT INTO family VALUES (8, 1, 'Colin');
INSERT INTO family VALUES (9, 8, 'Mark');
INSERT INTO family VALUES (10, 8, 'Simon');
WITH RECURSIVE a AS (
  SELECT KEY, parent_key, name, 1::INTEGER level, ARRAY[KEY] path, ' ' indent,
         CASE WHEN EXISTS (SELECT 1 FROM family f2 WHERE f2.parent_key = f1.key )
		      THEN 0 ELSE 1 END is_leaf
  FROM   family f1
  WHERE  parent_key IS NULL
  UNION ALL
  SELECT b.key, b.parent_key, a.indent || b.name, a.level +1, array_append(a.path, b.key), a.indent || ' ',
         CASE WHEN EXISTS (SELECT 1 FROM family f2 WHERE f2.parent_key = b.key )
		      THEN 0 ELSE 1 END is_leaf
  FROM   family b
  JOIN   a ON a.key = b.parent_key )
SELECT KEY, parent_key, name, level, path, is_leaf FROM a ORDER BY path;

Templates

Functions

CREATE [OR REPLACE] FUNCTION fnc_nme()
   RETURNS <return type> 
   LANGUAGE plpgsql
AS $$
DECLARE 
-- Variables
BEGIN
 -- Logic
END; $$

Procedures

CREATE [OR REPLACE] PROCEDURE prc_nme()
LANGUAGE plpgsql
AS $$
DECLARE
-- Variables
BEGIN
-- Body
END; $$

If Then Else

IF condition_1 THEN
  statement_1;
ELSIF condition_n THEN
  statement_n;
ELSE
  else-statement;
END IF;

Case

CASE RATE
  WHEN 'a' THEN variable = 1;
  WHEN 'b' THEN variable = 2;
  ELSE PRICE_SEGMENT = 0;
END CASE;

CASE 
  WHEN total > 200 THEN variable = 'PLATINUM' ;
  WHEN total > 100 THEN variable = 'GOLD' ;
  ELSE variable = 'SILVER' ;
END CASE;

Loop

LOOP
   -- Statements
   IF condition THEN
      EXIT;
   END IF;
END LOOP;

WHILE CONDITION LOOP
   -- Statements;
END LOOP;

FOR loop_counter in [ reverse ] FROM.. TO [ by step ] LOOP
    -- Statements
END LOOP
postgresqlfunctions.txt · Last modified: 2025/03/08 22:24 by 127.0.0.1