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