561 lines
12 KiB
PL/PgSQL
561 lines
12 KiB
PL/PgSQL
CREATE OR REPLACE FUNCTION FIND_IN_SET(
|
|
target text,
|
|
list text
|
|
) RETURNS boolean AS $$
|
|
DECLARE
|
|
arr text[];
|
|
i integer;
|
|
BEGIN
|
|
IF list IS NULL OR list = '' THEN
|
|
RETURN false;
|
|
END IF;
|
|
|
|
arr := string_to_array(list, ',');
|
|
|
|
FOR i IN 1..array_length(arr, 1) LOOP
|
|
IF arr[i] = target THEN
|
|
RETURN true;
|
|
END IF;
|
|
END LOOP;
|
|
|
|
RETURN false;
|
|
END;
|
|
$$ LANGUAGE plpgsql IMMUTABLE;
|
|
|
|
--
|
|
|
|
CREATE OR REPLACE FUNCTION FIND_IN_SET(
|
|
target integer,
|
|
list text
|
|
) RETURNS boolean AS $$
|
|
BEGIN
|
|
RETURN FIND_IN_SET(target::text, list);
|
|
END;
|
|
$$ LANGUAGE plpgsql IMMUTABLE;
|
|
|
|
--
|
|
|
|
CREATE OR REPLACE FUNCTION GROUP_CONCAT(
|
|
input text,
|
|
delimiter text = ','
|
|
) RETURNS text AS $$
|
|
BEGIN
|
|
RETURN string_agg(input, delimiter);
|
|
END;
|
|
$$ LANGUAGE plpgsql IMMUTABLE;
|
|
|
|
CREATE OR REPLACE FUNCTION GROUP_CONCAT(
|
|
input numeric,
|
|
delimiter text = ','
|
|
) RETURNS text AS $$
|
|
BEGIN
|
|
RETURN string_agg(input::text, delimiter);
|
|
END;
|
|
$$ LANGUAGE plpgsql IMMUTABLE;
|
|
|
|
CREATE OR REPLACE FUNCTION GROUP_CONCAT(
|
|
input integer,
|
|
delimiter text = ','
|
|
) RETURNS text AS $$
|
|
BEGIN
|
|
RETURN string_agg(input::text, delimiter);
|
|
END;
|
|
$$ LANGUAGE plpgsql IMMUTABLE;
|
|
|
|
--
|
|
|
|
CREATE OR REPLACE FUNCTION ROUND(
|
|
num float,
|
|
decimals integer
|
|
) RETURNS numeric AS $$
|
|
BEGIN
|
|
RETURN ROUND(num::numeric, decimals);
|
|
END;
|
|
$$ LANGUAGE plpgsql IMMUTABLE;
|
|
|
|
--
|
|
|
|
CREATE OR REPLACE FUNCTION ROUND(
|
|
num double precision,
|
|
decimals integer
|
|
) RETURNS numeric AS $$
|
|
BEGIN
|
|
RETURN ROUND(num::numeric, decimals);
|
|
END;
|
|
$$ LANGUAGE plpgsql IMMUTABLE;
|
|
|
|
--
|
|
|
|
CREATE OR REPLACE FUNCTION ROUND(
|
|
num text,
|
|
decimals integer
|
|
) RETURNS numeric AS $$
|
|
BEGIN
|
|
RETURN ROUND(num::numeric, decimals);
|
|
END;
|
|
$$ LANGUAGE plpgsql IMMUTABLE;
|
|
|
|
--
|
|
|
|
CREATE OR REPLACE FUNCTION TIMESTAMPDIFF(
|
|
unit TEXT,
|
|
start_time TIMESTAMP,
|
|
end_time TIMESTAMP
|
|
) RETURNS INTEGER AS $$
|
|
DECLARE
|
|
diff_interval INTERVAL;
|
|
diff_seconds NUMERIC;
|
|
BEGIN
|
|
diff_interval := end_time - start_time;
|
|
|
|
CASE lower(unit)
|
|
WHEN 'year' THEN
|
|
RETURN EXTRACT(YEAR FROM end_time) - EXTRACT(YEAR FROM start_time)
|
|
- CASE WHEN (EXTRACT(MONTH FROM end_time) < EXTRACT(MONTH FROM start_time))
|
|
OR (EXTRACT(MONTH FROM end_time) = EXTRACT(MONTH FROM start_time)
|
|
AND EXTRACT(DAY FROM end_time) < EXTRACT(DAY FROM start_time))
|
|
THEN 1 ELSE 0 END;
|
|
WHEN 'month' THEN
|
|
RETURN (EXTRACT(YEAR FROM end_time) - EXTRACT(YEAR FROM start_time)) * 12
|
|
+ (EXTRACT(MONTH FROM end_time) - EXTRACT(MONTH FROM start_time))
|
|
- CASE WHEN EXTRACT(DAY FROM end_time) < EXTRACT(DAY FROM start_time)
|
|
THEN 1 ELSE 0 END;
|
|
WHEN 'day' THEN
|
|
RETURN EXTRACT(DAY FROM diff_interval);
|
|
WHEN 'hour' THEN
|
|
diff_seconds := EXTRACT(EPOCH FROM diff_interval);
|
|
RETURN floor(diff_seconds / 3600);
|
|
WHEN 'minute' THEN
|
|
diff_seconds := EXTRACT(EPOCH FROM diff_interval);
|
|
RETURN floor(diff_seconds / 60);
|
|
WHEN 'second' THEN
|
|
RETURN EXTRACT(EPOCH FROM diff_interval);
|
|
ELSE
|
|
RETURN NULL;
|
|
END CASE;
|
|
END;
|
|
$$ LANGUAGE plpgsql IMMUTABLE;
|
|
|
|
--
|
|
|
|
CREATE OR REPLACE FUNCTION IFNULL(bigint, integer)
|
|
RETURNS bigint AS $$
|
|
BEGIN
|
|
RETURN COALESCE($1, $2::bigint);
|
|
END;
|
|
$$ LANGUAGE plpgsql IMMUTABLE;
|
|
|
|
--
|
|
|
|
CREATE OR REPLACE FUNCTION IFNULL(double precision, integer)
|
|
RETURNS double precision AS $$
|
|
BEGIN
|
|
RETURN COALESCE($1, $2::double precision);
|
|
END;
|
|
$$ LANGUAGE plpgsql IMMUTABLE;
|
|
|
|
--
|
|
|
|
CREATE OR REPLACE FUNCTION IFNULL(integer, bigint)
|
|
RETURNS bigint AS $$
|
|
BEGIN
|
|
RETURN COALESCE($1::bigint, $2);
|
|
END;
|
|
$$ LANGUAGE plpgsql IMMUTABLE;
|
|
|
|
--
|
|
|
|
CREATE OR REPLACE FUNCTION IFNULL(bigint, bigint)
|
|
RETURNS bigint AS $$
|
|
BEGIN
|
|
RETURN COALESCE($1, $2);
|
|
END;
|
|
$$ LANGUAGE plpgsql IMMUTABLE;
|
|
|
|
--
|
|
|
|
CREATE OR REPLACE FUNCTION IFNULL(integer, integer)
|
|
RETURNS integer AS $$
|
|
BEGIN
|
|
RETURN COALESCE($1, $2);
|
|
END;
|
|
$$ LANGUAGE plpgsql IMMUTABLE;
|
|
|
|
--
|
|
|
|
CREATE OR REPLACE FUNCTION IFNULL(numeric, numeric)
|
|
RETURNS numeric AS $$
|
|
BEGIN
|
|
RETURN COALESCE($1, $2);
|
|
END;
|
|
$$ LANGUAGE plpgsql IMMUTABLE;
|
|
|
|
--
|
|
|
|
CREATE OR REPLACE FUNCTION IFNULL(text, text)
|
|
RETURNS text AS $$
|
|
BEGIN
|
|
RETURN COALESCE($1, $2);
|
|
END;
|
|
$$ LANGUAGE plpgsql IMMUTABLE;
|
|
|
|
--
|
|
|
|
CREATE OR REPLACE FUNCTION day(date_val DATE)
|
|
RETURNS INTEGER AS $$ BEGIN RETURN EXTRACT(DAY FROM date_val)::INTEGER; END; $$ LANGUAGE plpgsql;
|
|
|
|
--
|
|
|
|
CREATE OR REPLACE FUNCTION day(date_val TIMESTAMP)
|
|
RETURNS INTEGER AS $$ BEGIN RETURN EXTRACT(DAY FROM date_val)::INTEGER; END; $$ LANGUAGE plpgsql;
|
|
|
|
--
|
|
|
|
CREATE OR REPLACE FUNCTION day(date_val TIMESTAMPTZ)
|
|
RETURNS INTEGER AS $$ BEGIN RETURN EXTRACT(DAY FROM date_val)::INTEGER; END; $$ LANGUAGE plpgsql;
|
|
|
|
--
|
|
|
|
CREATE OR REPLACE FUNCTION MONTH(date_val DATE)
|
|
RETURNS INTEGER AS $$ BEGIN RETURN EXTRACT(MONTH FROM date_val)::INTEGER; END; $$ LANGUAGE plpgsql;
|
|
|
|
--
|
|
|
|
CREATE OR REPLACE FUNCTION MONTH(date_val TIMESTAMP)
|
|
RETURNS INTEGER AS $$ BEGIN RETURN EXTRACT(MONTH FROM date_val)::INTEGER; END; $$ LANGUAGE plpgsql;
|
|
|
|
--
|
|
|
|
CREATE OR REPLACE FUNCTION MONTH(date_val TIMESTAMPTZ)
|
|
RETURNS INTEGER AS $$ BEGIN RETURN EXTRACT(MONTH FROM date_val)::INTEGER; END; $$ LANGUAGE plpgsql;
|
|
|
|
--
|
|
|
|
CREATE OR REPLACE FUNCTION YEAR(date_val DATE)
|
|
RETURNS INTEGER AS $$ BEGIN RETURN EXTRACT(YEAR FROM date_val)::INTEGER; END; $$ LANGUAGE plpgsql;
|
|
|
|
--
|
|
|
|
CREATE OR REPLACE FUNCTION YEAR(date_val TIMESTAMP)
|
|
RETURNS INTEGER AS $$ BEGIN RETURN EXTRACT(YEAR FROM date_val)::INTEGER; END; $$ LANGUAGE plpgsql;
|
|
|
|
--
|
|
|
|
CREATE OR REPLACE FUNCTION YEAR(date_val TIMESTAMPTZ)
|
|
RETURNS INTEGER AS $$ BEGIN RETURN EXTRACT(YEAR FROM date_val)::INTEGER; END; $$ LANGUAGE plpgsql;
|
|
|
|
--
|
|
|
|
CREATE OR REPLACE FUNCTION DATEDIFF(
|
|
end_date ANYELEMENT,
|
|
start_date ANYELEMENT
|
|
) RETURNS INTEGER AS $$
|
|
BEGIN
|
|
RETURN (end_date - start_date)::INTEGER;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
--
|
|
|
|
CREATE OR REPLACE FUNCTION "IF"(
|
|
condition BOOLEAN,
|
|
true_val BOOLEAN,
|
|
false_val BOOLEAN
|
|
) RETURNS BOOLEAN AS $$
|
|
BEGIN
|
|
IF condition THEN
|
|
RETURN true_val;
|
|
ELSE
|
|
RETURN false_val;
|
|
END IF;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
--
|
|
|
|
CREATE OR REPLACE FUNCTION "IF"(
|
|
condition BOOLEAN,
|
|
true_val DOUBLE PRECISION,
|
|
false_val INTEGER
|
|
) RETURNS DOUBLE PRECISION AS $$
|
|
BEGIN
|
|
IF condition THEN
|
|
RETURN true_val;
|
|
ELSE
|
|
RETURN false_val::DOUBLE PRECISION;
|
|
END IF;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
--
|
|
|
|
CREATE OR REPLACE FUNCTION "IF"(
|
|
condition BOOLEAN,
|
|
true_val DOUBLE PRECISION,
|
|
false_val DOUBLE PRECISION
|
|
) RETURNS DOUBLE PRECISION AS $$
|
|
BEGIN
|
|
IF condition THEN
|
|
RETURN true_val;
|
|
ELSE
|
|
RETURN false_val;
|
|
END IF;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
--
|
|
|
|
CREATE OR REPLACE FUNCTION "IF"(
|
|
condition BOOLEAN,
|
|
true_val TEXT,
|
|
false_val TEXT
|
|
) RETURNS TEXT AS $$
|
|
BEGIN
|
|
IF condition THEN
|
|
RETURN true_val;
|
|
ELSE
|
|
RETURN false_val;
|
|
END IF;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
--
|
|
|
|
CREATE OR REPLACE FUNCTION "IF"(
|
|
condition BOOLEAN,
|
|
true_val INTEGER,
|
|
false_val INTEGER
|
|
) RETURNS INTEGER AS $$
|
|
BEGIN
|
|
IF condition THEN
|
|
RETURN true_val;
|
|
ELSE
|
|
RETURN false_val;
|
|
END IF;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
--
|
|
|
|
CREATE OR REPLACE FUNCTION "IF"(
|
|
condition BOOLEAN,
|
|
true_val TEXT,
|
|
false_val DATE
|
|
) RETURNS DATE AS $$
|
|
BEGIN
|
|
IF condition THEN
|
|
RETURN true_val;
|
|
ELSE
|
|
RETURN false_val::DATE;
|
|
END IF;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
--
|
|
|
|
CREATE OR REPLACE FUNCTION "IF"(
|
|
condition BOOLEAN,
|
|
true_val DATE,
|
|
false_val DATE
|
|
) RETURNS DATE AS $$
|
|
BEGIN
|
|
IF condition THEN
|
|
RETURN true_val;
|
|
ELSE
|
|
RETURN false_val;
|
|
END IF;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
--
|
|
|
|
CREATE OR REPLACE FUNCTION "IF"(
|
|
condition BOOLEAN,
|
|
true_val timestamp without time zone,
|
|
false_val DATE
|
|
) RETURNS DATE AS $$
|
|
BEGIN
|
|
IF condition THEN
|
|
RETURN true_val::DATE;
|
|
ELSE
|
|
RETURN false_val;
|
|
END IF;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
--
|
|
|
|
CREATE OR REPLACE FUNCTION "IF"(
|
|
condition BOOLEAN,
|
|
true_val timestamp without time zone,
|
|
false_val timestamp without time zone
|
|
) RETURNS DATE AS $$
|
|
BEGIN
|
|
IF condition THEN
|
|
RETURN true_val;
|
|
ELSE
|
|
RETURN false_val;
|
|
END IF;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
--
|
|
|
|
CREATE OR REPLACE FUNCTION DATE_FORMAT(
|
|
date_val DATE,
|
|
format_str TEXT
|
|
) RETURNS TEXT AS $$
|
|
DECLARE
|
|
pg_format TEXT;
|
|
BEGIN
|
|
pg_format := REPLACE(format_str, '%Y', 'YYYY');
|
|
pg_format := REPLACE(pg_format, '%y', 'YY');
|
|
pg_format := REPLACE(pg_format, '%m', 'MM');
|
|
pg_format := REPLACE(pg_format, '%c', 'MM');
|
|
pg_format := REPLACE(pg_format, '%d', 'DD');
|
|
pg_format := REPLACE(pg_format, '%e', 'DD');
|
|
pg_format := REPLACE(pg_format, '%H', 'HH24');
|
|
pg_format := REPLACE(pg_format, '%h', 'HH12');
|
|
pg_format := REPLACE(pg_format, '%i', 'MI');
|
|
pg_format := REPLACE(pg_format, '%s', 'SS');
|
|
pg_format := REPLACE(pg_format, '%W', 'Day');
|
|
pg_format := REPLACE(pg_format, '%a', 'Dy');
|
|
pg_format := REPLACE(pg_format, '%M', 'Month');
|
|
pg_format := REPLACE(pg_format, '%b', 'Mon');
|
|
|
|
RETURN TO_CHAR(date_val, pg_format);
|
|
END;
|
|
$$ LANGUAGE plpgsql IMMUTABLE;
|
|
|
|
--
|
|
|
|
CREATE OR REPLACE FUNCTION instr(
|
|
str TEXT,
|
|
sub_str TEXT
|
|
)
|
|
RETURNS INTEGER AS $$
|
|
BEGIN
|
|
IF str IS NULL OR sub_str IS NULL OR sub_str = '' THEN
|
|
RETURN 0;
|
|
END IF;
|
|
|
|
RETURN strpos(LOWER(str), LOWER(sub_str));
|
|
END;
|
|
$$ LANGUAGE plpgsql IMMUTABLE;
|
|
|
|
--
|
|
|
|
CREATE OR REPLACE FUNCTION left(
|
|
str TEXT,
|
|
length INT
|
|
)
|
|
RETURNS TEXT AS $$
|
|
BEGIN
|
|
IF str IS NULL OR length IS NULL THEN
|
|
RETURN NULL;
|
|
END IF;
|
|
IF length <= 0 THEN
|
|
RETURN '';
|
|
END IF;
|
|
RETURN pg_catalog.left(str, length);
|
|
END;
|
|
$$ LANGUAGE plpgsql IMMUTABLE;
|
|
|
|
--
|
|
|
|
CREATE OR REPLACE FUNCTION left(
|
|
str DATE,
|
|
length INT
|
|
)
|
|
RETURNS TEXT AS $$
|
|
BEGIN
|
|
RETURN left(str::TEXT, length);
|
|
END;
|
|
$$ LANGUAGE plpgsql IMMUTABLE;
|
|
|
|
--
|
|
|
|
CREATE OR REPLACE FUNCTION left(
|
|
str NUMERIC,
|
|
length INT
|
|
)
|
|
RETURNS TEXT AS $$
|
|
BEGIN
|
|
RETURN left(str::TEXT, length);
|
|
END;
|
|
$$ LANGUAGE plpgsql IMMUTABLE;
|
|
|
|
--
|
|
|
|
CREATE OR REPLACE FUNCTION left(
|
|
str TIMESTAMP,
|
|
length INT
|
|
)
|
|
RETURNS TEXT AS $$
|
|
BEGIN
|
|
RETURN left(str::TEXT, length);
|
|
END;
|
|
$$ LANGUAGE plpgsql IMMUTABLE;
|
|
|
|
--
|
|
|
|
CREATE OR REPLACE FUNCTION date_format(
|
|
input_date TIMESTAMP WITHOUT TIME ZONE,
|
|
format_str TEXT
|
|
) RETURNS TEXT AS $$
|
|
DECLARE
|
|
mapped_format TEXT := format_str;
|
|
BEGIN
|
|
mapped_format := REPLACE(mapped_format, '%Y', 'YYYY');
|
|
mapped_format := REPLACE(mapped_format, '%y', 'YY');
|
|
mapped_format := REPLACE(mapped_format, '%m', 'MM');
|
|
mapped_format := REPLACE(mapped_format, '%c', 'FM MM');
|
|
mapped_format := REPLACE(mapped_format, '%d', 'DD');
|
|
mapped_format := REPLACE(mapped_format, '%e', 'FM DD');
|
|
mapped_format := REPLACE(mapped_format, '%H', 'HH24');
|
|
mapped_format := REPLACE(mapped_format, '%h', 'HH12');
|
|
mapped_format := REPLACE(mapped_format, '%i', 'MI');
|
|
mapped_format := REPLACE(mapped_format, '%s', 'SS');
|
|
mapped_format := REPLACE(mapped_format, '%W', 'Day');
|
|
mapped_format := REPLACE(mapped_format, '%w', 'D');
|
|
mapped_format := REPLACE(mapped_format, '%M', 'Month');
|
|
mapped_format := REPLACE(mapped_format, '%b', 'Mon');
|
|
mapped_format := REPLACE(mapped_format, '%p', 'AM');
|
|
mapped_format := REPLACE(mapped_format, '%T', 'HH24:MI:SS');
|
|
mapped_format := REPLACE(mapped_format, '%j', 'DDD');
|
|
|
|
mapped_format := REPLACE(mapped_format, 'FM MM', 'FMMM');
|
|
mapped_format := REPLACE(mapped_format, 'FM DD', 'FMDD');
|
|
|
|
RETURN TO_CHAR(input_date, mapped_format);
|
|
END;
|
|
$$ LANGUAGE plpgsql IMMUTABLE;
|
|
|
|
--
|
|
|
|
CREATE OR REPLACE FUNCTION update_tables_seq ( )
|
|
RETURNS void AS $$
|
|
DECLARE
|
|
seq_name_cursor CURSOR FOR
|
|
SELECT a.attname AS column_name, c.relname AS table_name, s.relname AS seq_name
|
|
FROM pg_class c
|
|
JOIN pg_depend d ON d.refobjid = c.oid
|
|
JOIN pg_class s ON d.objid = s.oid
|
|
JOIN pg_namespace n ON s.relnamespace = n.oid
|
|
JOIN pg_attribute a ON a.attrelid = c.oid AND a.attnum = d.refobjsubid
|
|
WHERE d.classid = 'pg_class'::regclass
|
|
AND d.refclassid = 'pg_class'::regclass
|
|
AND s.relkind = 'S'
|
|
AND n.nspname = 'public';
|
|
|
|
prepared_sql VARCHAR(255);
|
|
|
|
BEGIN
|
|
FOR ref_record in seq_name_cursor LOOP
|
|
prepared_sql := 'SELECT setval( ''' || ref_record.seq_name;
|
|
prepared_sql := prepared_sql || ''','||'( SELECT MAX ( ' || ref_record.column_name || ' ) FROM "'||ref_record.table_name||'") );';
|
|
RAISE NOTICE '%', prepared_sql;
|
|
EXECUTE prepared_sql;
|
|
END LOOP;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|