(交叉发布到(和answered on)pgsql-general )
我使用PostgreSQL,定义自己的域和相等运算符。我不能让PostgreSQL在查询中使用我的运算符函数,而没有显式地将字符串参数转换为我在定义运算符时使用的类型。我的问题是如何使我的自定义运算符在没有强制转换的情况下使用。
作为示例:首先我定义该类型的域和表列。对于此示例,类型要求其值为三个大写字母A
,B
或C
,并且相等运算符将导致查询匹配,无论大小写如何。
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()
,因此它的第二个参数类型是varchar
和char(3)
,但那些仍然需要在查询的WHERE
- 子句中进行强制转换。我也试过了anyelement
,但即使是演员也不行。