2012-03-05 53 views
2

考慮下面的查詢錯誤:的PostgreSQL 9.1.3:「經營者不是唯一的」問題

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類型轉換我的節點,我已經定義了其中13個,其中一個是:

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

當我們去PG 9.1,我重新隱式轉換後的method described here

我想知道如果我確實已經創建重複的運營商,如果是這樣,我應該如何去清理它呢?如果沒有,爲什麼我會得到這種錯誤?這似乎是一個相當直接的演員。

謝謝!

+4

選擇 '測試' || 123;是不正確的,你試圖連接文本和整數,選擇「測試」::文本|| 123;是不正確的,你試圖將文本轉換爲文本,然後用整數連接,你需要做的是:select'test'|| 123 ::文本;這工作! – ComputerSaysNo 2012-03-05 02:02:03

+0

這是一個明確的最佳實踐。 – Kuberchaun 2012-03-05 16:31:28

回答

1

我已經嘗試添加相同的演員和它給了我同樣的錯誤在9.1.2。我還注意到該博客上的第一條評論(2009年2月24日)報告了這個錯誤。

這可能是與手冊中的以下評論:

注意:在PostgreSQL 8.3版本中,這些功能會默默接受一些非字符串數據類型的值,以及,由於存在從這些數據類型到文本的隱式強制。這些強制措施已被刪除,因爲它們經常引起令人驚訝的行爲。 然而,串並置運算符(||)仍然接受非字符串輸入,所以只要至少一個輸入爲字符串類型。

我想你是通過添加隱式轉換來創建重複的操作符。該整數可以轉換爲文本並使用text || text或不使用text || integer。查看錶格,我認爲第二個可能是text || anynonarray,它不能被刪除。

總之解決這個問題是使用時,使用顯式強制的唯一途徑||運算符刪除您創建的隱式轉換,並在其他位置使用顯式轉換。

+0

無論如何放棄運算符||(text,anynonarray)?我無法對數百個查詢進行明確的轉換。 – 2012-04-26 14:52:46

+0

沒有。我把它綁住了,但它的內置,不能改變或刪除。 – 2012-04-28 08:35:25

0

面臨同類問題的地方來解決一個錯誤我要補充那些老隱式轉換而導致的錯誤在其他地方一樣 - 選擇1 || '/%';查詢將拋出錯誤的不是唯一的運算符,我不得不刪除整數作爲文本轉換。