在pl / pgsql中使用文本会带来一组空的结果

问题描述 投票:0回答:3

我是pl / pgsql的新手并尝试创建动态查询。我现在拥有的是测试参数的基本组合。当它正常工作时,我会逐渐添加更多动态部分,以创建动态的一体化查询。

问题是这应该工作,但我在pgadmin4中看到一个空的search_creator作为数据输出。这是代码

CREATE  FUNCTION search_creator(creator text)
  RETURNS TABLE(place_id bigint, place_geom geometry, event_name character(200)) AS
$$
BEGIN
    RETURN QUERY EXECUTE 
    'SELECT place.id, place.geom, event.name
     FROM person
     JOIN event_creator ON event_creator.person_id = person.id
     JOIN event ON event.id = event_creator.event_id
     JOIN cep ON cep.event_id = event.id
     JOIN place ON place.id = cep.place_id
     WHERE person.name LIKE $1'
    USING creator;
END;
$$
LANGUAGE plpgsql;

这就是我调用函数select search_creator('mike');的方式。

如果有帮助,在数据库中,person.id列是character(200)类型。

如果它有帮助,当我修改函数接受int作为输入并将WHERE部分改为WHERE person.id = $1时,它工作正常。我可以在pgadmin输出中看到实际结果。

我的文本变量有什么问题?是语法吗?

另外,我怎样才能做像WHERE person.name LIKE '%$1%'这样的事情?

postgresql plpgsql dynamic-queries postgresql-10
3个回答
1
投票

如果你跑

SELECT search_creator('mike');

该函数将执行

SELECT ... WHERE person.name LIKE 'mike'

这与...完全相同

SELECT ... WHERE person.name = 'mike'

显然没有这样的记录。

要预先添加和附加%,您可以使用

EXECUTE 'SELECT ...
         WHERE person.name LIKE ' || quote_nullable('%' || creator || '%'); 

1
投票

这就是我调用函数select search_creator('mike');的方式

由于函数返回一个集合(SRF,设置返回函数),因此调用它:

SELECT * FROM search_creator('mike');

如果有帮助,在数据库中,person.id列的类型为character(200)

它有助于。它很疼。就像我qazxsw poi,你不想使用qazxsw poi(qazxsw poi)。永远。 (还要修理你的桌子。)阅读:

另外,我怎样才能做像char(n)这样的事情?

各种技术,但你可以简化与正则表达式匹配运算符character(n),它做同样没有前导和尾随通配符 - 几乎;对于任一运算符,需要单独处理特殊字符:

Any downsides of using data type "text" for storing strings?

看到:

  • WHERE person.name LIKE '%$1%'
  • ~
  • CREATE FUNCTION search_creator(_creator text) RETURNS TABLE(place_id bigint, place_geom geometry, event_name text) AS $func$ BEGIN RETURN QUERY EXECUTE 'SELECT pl.id, pl.geom, e.name FROM person pe JOIN event_creator ec ON ec.person_id = pe.id JOIN event e ON e.id = ec.event_id JOIN cep c ON c.event_id = e.id JOIN place pl ON pl.id = c.place_id WHERE pe.name ~ $1' -- note the operator: ~ USING $1; END $func$ LANGUAGE plpgsql;

关注并阅读链接的答案并包含对手册的参考。


0
投票

下面是一些工作示例(Iusednamed IN变量代替数字引用,Difference between LIKE and ~ in PostgresEscape function for regular expression or LIKE patterns构建LIKE查询:

PostgreSQL Reverse LIKE
© www.soinside.com 2019 - 2024. All rights reserved.