我有以下查询
SELECT v.id FROM visitors v
LEFT JOIN trackings t on v.id = t.visitor_id
WHERE v.app_id = 'xxx'
AND (field = quote_ident('app_name')
and string_value ilike quote_nullable('test_app'))
问题是当我在quote_nullable
上使用string_value
时,查询无法返回任何结果。它仅适用于quote_ident
,但据我所知,这不是合适的功能。
我在如何构建查询服务器端的伪代码示例(使用过滤器上的模式匹配(starts_with,ends_with等)。
filter = user_params["filter"]
field = user_params["field"]
value = user_params["value"]
...
"starts_with" -> "(field = quote_ident('#{field}') AND string_value ILIKE '#{value}' || '%')"
"ends_with" -> "(field = quote_ident('#{field}') AND string_value ILIKE '%' || '#{value}')"
"contains" -> "(field = quote_ident('#{field}') AND string_value ILIKE '%' || '#{value}' || '%')"
"does_not_contain" -> "(field = quote_ident('#{field}') AND string_value NOT ILIKE '%' || '#{value}' || '%')"
稍后在数据库中,我调用一个类似
的存储prodecure filter_length := COALESCE(array_length(filters, 1), 0);
filterstring := array_to_string(filters, ' OR ');
IF filterstring = '' or filterstring is null THEN
filterstring := '1=1';
END IF;
sql := format('
SELECT v.id FROM visitors v
LEFT JOIN trackings t on v.id = t.visitor_id
WHERE v.app_id = app_id and (%s)
group by v.id
having case when %s > 0 then count(v.id) = %s else true end
', filterstring, custom_filter_length, custom_filter_length);
RETURN QUERY EXECUTE sql;
filters
是一系列条件(我之前建立的条件)
有什么想法吗?