postgresql - 如何在 Postgres 中实现包含运算符

标签 postgresql operators plpgsql contains

如何实现字符串的包含运算符,如果左字符串包含在右字符串中,则返回 true。

运算符(operator)名称可以是任意的。我尝试了 @@ 和下面的代码,但是

选择'A'@@'SAS'

返回错误。

如何修复?

CREATE OR REPLACE FUNCTION public.contains(searchFor text, searchIn text)
RETURNS bool

AS $BODY$ BEGIN

RETURN position( searchFor in searchIn)<>0;

END; $BODY$ language plpgsql immutable  RETURNS NULL ON NULL INPUT;

CREATE OPERATOR public.@@ (
    leftarg = text,
    rightarg = text,
    procedure = public.contains
);

在 windows 和 linux 中使用 Postgres 9.1 及以上版本。

select contains('A' , 'SAS' )

按预期返回 true。

更新

我在 9.1 代码中尝试了答案:

CREATE OR REPLACE FUNCTION public.contains(searchFor text, searchIn text)
RETURNS bool
LANGUAGE sql IMMUTABLE
AS $BODY$
SELECT position( searchFor in searchIn )<>0;
$BODY$;


CREATE OPERATOR public.<@ (
    leftarg = text,
    rightarg = text,
    procedure = public.contains
);

但出现错误

ERROR:  column "searchin" does not exist
LINE 5: SELECT position( searchFor in searchIn )<>0;

如何让它在 9.1 中工作?在 9.3 中它可以工作。

使用

“x86_64-unknown-linux-gnu 上的 PostgreSQL 9.1.2,由 gcc-4.4.real (Debian 4.4.5-8) 4.4.5,64 位编译”

最佳答案

PostgreSQL 已经定义了一个 @@ (text,text) 上的接线员在pg_catalog架构,定义为:

regress=> \do @@
                                  List of operators
   Schema   | Name | Left arg type | Right arg type | Result type |    Description    
------------+------+---------------+----------------+-------------+-------------------
 pg_catalog | @@   | text          | text           | boolean     | text search match

这优先于 @@您在 public 中定义模式。

我建议使用运算符 <@对于 contains ,因为 that's consistent with the array contains and contained-by operators . pg_catalog 中没有使用它对于 text ...但不能保证不会在未来的版本中或通过扩展添加。

如果您想保证您的运算符优先于 pg_catalog 中的运算符,您需要将它们放在不同的模式中并将其放在搜索路径的第一位,明确地放在 pg_catalog 之前.所以像这样:

CREATE SCHEMA my_operators;

CREATE OR REPLACE FUNCTION my_operators.contains(searchFor text, searchIn text)
RETURNS bool
LANGUAGE sql IMMUTABLE
AS $BODY$
SELECT position( searchFor in searchIn)<>0;
$BODY$;

CREATE OPERATOR my_operators.<@ (
    leftarg = text,
    rightarg = text,
    procedure = public.contains
);

然后

SET search_path = 'my_operators, pg_catalog, public';

你可以用 ALTER USER 来做和/或 ALTER DATABASE使其成为默认值。

关于postgresql - 如何在 Postgres 中实现包含运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24851763/

相关文章:

sql - 将列添加到 %rowtype 的记录变量

sql - 选择不同的如果?

postgresql - 意外的 SQL 结果 : string vs. 直接 SQL

mysql - 在 PostgreSQL 中使用嵌套查询进行更新,但出现不需要的结果

javascript - JS 中的运算符问题

Java算术表达式

Java:如果语句中有两个或多个条件,if 语句将不起作用吗?

postgresql - 引发异常后提交事务

postgresql - 临时表不是已知变量

sql - 如何在分组集查询中仅显示前 2 个和前 1 个值?