引用文字导致无法返回结果

时间:2016-11-09 20:48:25

标签: sql postgresql

我有以下查询

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是一系列条件(我之前建立的条件)

有什么想法吗?

0 个答案:

没有答案