-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapply_filter.sql
More file actions
96 lines (85 loc) · 1.92 KB
/
Copy pathapply_filter.sql
File metadata and controls
96 lines (85 loc) · 1.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
DROP function IF EXISTS apply_filter;
/*
* Function to filter any table based on JSON params in SQL
*/
CREATE function apply_filter (
tablename VARCHAR(255),
params json,
conjunction VARCHAR(3) = 'AND'
)
RETURNS SETOF RECORD
LANGUAGE PLPGSQL
AS
$BODY$
DECLARE
invalid_keys text = '';
sql_query text;
BEGIN
DROP TABLE columns;
CREATE TEMP TABLE columns (
name VARCHAR(255)
);
--
-- Step 1: Get the column list
--
INSERT INTO columns
SELECT
column_name
FROM INFORMATION_SCHEMA.columns
WHERE TABLE_NAME = tablename;
DROP TABLE param_table;
CREATE TEMP TABLE param_table (
filter_key VARCHAR(255),
filter_value text
);
--
-- Step 2: Parse the supplied JSON parameter
--
INSERT INTO param_table (filter_key, filter_value)
SELECT
key AS filter_key,
value AS filter_value
FROM json_each_text(params);
invalid_keys := (
SELECT
STRING_AGG(name, ', ')
FROM (
SELECT filter_key AS name FROM param_table
EXCEPT
SELECT name FROM columns
) x
);
--
-- Step 3: Error handling for invalid columns in JSON
--
IF (invalid_keys <> '') THEN
RAISE EXCEPTION 'The source table does not have some filter key(s) that exist in the param: %', invalid_keys;
END IF;
--
-- Step 4: Generate dynamic SQL statement
--
sql_query :=
'SELECT ' || (
--
-- Append comma separated string of column names in tablename
--
SELECT STRING_AGG(name, ',') FROM columns
) || ' FROM ' || tablename || ' s
WHERE ' || (
--
-- Generate and add the where clause based on
-- @param and @conjunction
--
SELECT
STRING_AGG(
' s.' || filter_key || ' = ''' || filter_value || ''' ',
conjunction
)
FROM param_table
);
-- Show the generated SQL query
RAISE NOTICE '%', sql_query;
-- Execute the generated SQL query to get the filtered result set
RETURN QUERY EXECUTE sql_query;
END
$BODY$