У меня есть следующие функцииУсловный WHERE выражение в динамическом запросе
CREATE OR REPLACE FUNCTION match_custom_filter(filters text[], id text)
RETURNS boolean LANGUAGE plpgsql as $$
DECLARE
r boolean;
BEGIN
execute format(
'SELECT 1 FROM trackings t LEFT JOIN visitors v ON v.id = t.visitor_id
WHERE v.id = ''%s'' AND %s',
id,
array_to_string(filters, ') AND ('))
into r;
RETURN r;
END $$;
select v.*, array_agg(g.name) as groups from visitors v join groups g on match_custom_filter(g.formatted_custom_filters, v.id)
where v.id = 'cov4pisw00000sjctfyvwq126'
group by v.id
Это прекрасно работает, когда фильтры не являются пустыми. Но также возможно, что фильтр пуст, и в этом случае у меня будет свисающий И без правой стороны.
Ошибка:
ERROR: syntax error at end of input
LINE 2: ... WHERE v.id = 'cov4pisw00000sjctfyvwq126' AND
^
QUERY: SELECT 1 FROM trackings t LEFT JOIN visitors v ON v.id = t.visitor_id
WHERE v.id = 'cov4pisw00000sjctfyvwq126' AND
CONTEXT: PL/pgSQL function match_custom_filter(text[],text) line 5 at EXECUTE statement
Какой самый лучший способ справиться с этим?
ОБНОВЛЕНИЕ:
Пример того, как я генерировать массив строковых фильтров основаны от JSONB массив объектов фильтра
def build_condition(%{"filter" => filter, "field" => field, "value" => value}) when field in @default_values do
case filter do
"greater_than" -> "#{field} > #{value}"
"less_than" -> "#{field} < #{value}"
"is" -> "#{field} = '#{value}'"
"is_not" -> "#{field} <> '#{value}'"
..
Может фильтр использовать любой оператор или это равенство? –
Когда вы говорите «пусто», вы имеете в виду пустую строку '' '',' NULL' или или? – Patrick
Операторы @ClodoaldoNeto, подобные этим: '# {field}> # {value}', '" # {field} ILIKE '# {value}' || '%' "и' "# {field}
Tarlen