gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 13:02:38 24 4
gpt4 key购买 nike

如何实现字符串的包含运算符,如果左字符串包含在右字符串中,则返回 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com