postgresql 9.1.3:“运算符不唯一”的问题

时间:2012-03-05 01:58:18

标签: postgresql

请考虑以下查询错误:

db=# select 'test' || 123;
ERROR:  operator is not unique: unknown || integer
LINE 1: select 'test' || 123;
                      ^
HINT:  Could not choose a best candidate operator. You might need to add explicit type casts.

db=# select 'test'::text || 123;
ERROR:  operator is not unique: text || integer
LINE 1: select 'test'::text || 123;
                            ^
HINT:  Could not choose a best candidate operator. You might need to add explicit type casts.

现在,在PGAdmin中,在我的DB的Casts节点中,我定义了13个,其中一个是:

CREATE CAST (integer AS text)
  WITH FUNCTION text(integer)
  AS IMPLICIT;

当我们进入PG 9.1时,我在method described here之后重新创建了隐式强制转换。

我想知道我是否确实创建了重复的操作符,如果是的话,我应该如何清理它?如果没有,为什么我会收到这种错误?这似乎是一个相当直接的演员。

谢谢!

2 个答案:

答案 0 :(得分:1)

我尝试添加相同的演员,它在9.1.2中给出了同样的错误。我还注意到该博客的第一条评论(2009年2月24日发布)报告了此错误。

这可能与手册中的以下评论有关:

  

注意:在PostgreSQL 8.3之前,由于存在从这些数据类型到文本的隐式强制,这些函数也会默默接受多个非字符串数据类型的值。这些强制措施已被删除,因为它们经常引起令人惊讶的行为。 但是,字符串连接运算符(||)仍然接受非字符串输入,只要至少有一个输入是字符串类型。

我认为您通过添加隐式转换来创建重复的运算符。整数可以转换为文本并使用text || text或不使用text || integer。查看表格,我认为第二个可能是text || anynonarray,不能删除。

简而言之,解决此问题的唯一方法是在使用||时使用显式强制转换operator OR 删除你创建的隐式转换,并在其他地方使用显式转换。

答案 1 :(得分:0)

遇到同样的问题在哪里解决一个错误我必须添加那些旧的隐式转换,但这导致其他地方的错误 - SELECT 1 || '/%';查询将抛出非唯一运算符的错误,我不得不将整数作为文本转换。