PostgreSQL用户定义的运算符函数:用于uncast字符串的参数类型是什么?

时间:2014-07-30 15:40:31

标签: sql operator-overloading user-defined-functions postgresql-9.3 user-defined-types

交叉发布到(和answered onpgsql-general

我使用PostgreSQL,定义自己的域和相等运算符。我不能让PostgreSQL在查询中使用我的运算符函数,而没有显式地将字符串参数转换为我在定义运算符时使用的类型。我的问题是如何使我的自定义运算符在没有强制转换的情况下使用。

作为示例:首先我定义该类型的域和表列。对于此示例,类型要求其值为三个大写字母ABC,并且相等运算符将导致查询匹配,无论大小写如何。

CREATE domain my_domain as char(3) check(VALUE similar to '[A-C]{3}');
CREATE TABLE my_table (val my_domain);
INSERT INTO my_table VALUES ('ABC');

列的类型为my_domain

sandbox=> \d my_table
    Table "public.my_table"
 Column |   Type    | Modifiers 
--------+-----------+-----------
 val    | my_domain | 

在定义自定义相等运算符之前,区分大小写的查询按预期工作。表中的行是大写字母,因此查询必须包含大写字母以匹配行

sandbox=> SELECT * FROM my_table WHERE val='abc';
 val 
-----
(0 rows)

sandbox=> SELECT * FROM my_table WHERE val='ABC';
 val 
-----
 ABC
(1 row)

接下来,我创建一个等于运算符来进行不区分大小写的匹配:

CREATE FUNCTION my_equals(this my_domain, that text) RETURNS boolean AS
'SELECT CAST (this AS text) = upper(that)' LANGUAGE SQL;
CREATE OPERATOR = (procedure=my_equals, leftarg=my_domain, rightarg = text);

调用new运算符导致包含小写字母的查询与大写列值匹配,但仅当我转换WHERE子句的类型时:

sandbox=> SELECT * FROM my_table WHERE val=CAST ('abc' AS text);
 val 
-----
 ABC
(1 row)

sandbox=> SELECT * FROM my_table WHERE val='abc';
 val 
-----
(0 rows)

问题:我该怎么做才能使用我的自定义相等运算符而不使用强制转换?换句话说,如何使上面的最后一个查询返回表行(不更改查询)?我已经尝试定义my_equals(),因此它的第二个参数类型是varcharchar(3),但那些仍然需要在查询的WHERE - 子句中进行强制转换。我也试过了anyelement,但即使是演员也不行。

0 个答案:

没有答案