WITH candidate_tables AS (
SELECT table_name
FROM information_schema.columns
WHERE table_schema = 'prod_line'
AND table_name LIKE 'table_param_pl_%'
GROUP BY table_name
HAVING
COUNT(*) FILTER (
WHERE column_name ILIKE '%from%'
) > 0
AND
COUNT(*) FILTER (
WHERE column_name ILIKE '%to%'
) > 0
AND
COUNT(*) FILTER (
WHERE data_type IN (
'numeric',
'integer',
'bigint',
'double precision',
'real'
)
) >= 4
)
SELECT
c.table_name,
c.column_name,
c.data_type
FROM information_schema.columns c
JOIN candidate_tables t
ON t.table_name = c.table_name
WHERE c.table_schema = 'prod_line'
ORDER BY
c.table_name,
c.ordinal_position;