2011-01-20 66 views
4

本地我正在用SQLite開發,但在我的生產主機上運行的是PostgreSQL。本地一切都很好,但不是生產主機。PGError:錯誤:運算符不存在:布爾值~~ *未知

我建立了一種搜索表單,我可以用我想要的任意組合來評估數據庫中的所有數據。這似乎工作正常,只要我不使用布爾和/或日期字段。 PostgreSQL的似乎不喜歡我的代碼非常...

所以,這裏的一些示例代碼:

unless params[:analysis][:sporty].blank? 
    tmp_conditions_customer << ["(sporty ILIKE ?)", "%#{params[:analysis][:sporty]}%"] 
end 

這個計算結果爲

SELECT COUNT(*) FROM "customers" WHERE ((sporty ILIKE '%%') 

爲什麼這麼呢?爲什麼 '%%'?

爲了測試部署,我使用Heroku和Exceptional插件。這個插件給我下面的提示:

HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.

由於出色的,但是這到底是什麼意思呢? :D類型轉換爲SQL查詢?那該怎麼辦?

在我的移民數據庫中的字段如下所示:

t.boolean :sporty 

而且在形式,其中我創建這個數據我使用這個代碼

<%= f.label :sporty %><br /> 
<%= f.select :sporty, options_for_select({ "Ja" => true, "Nein" => false }), { :include_blank => '-----'} %> 

正如我已經提到, SQLite是我的朋友,似乎是造成麻煩的PostgreSQL更嚴格的評估。

感謝您的幫助提前。

回答

4

直接回答接近底部。 。 。

This evaluates to

SELECT COUNT(*) FROM "customers" WHERE ((sporty ILIKE '%%') 

Why’s that anyway? Why the '%%'?

在SQL中, '%' 是一個通配符。但是你的問題似乎是你正在構建一個WHERE子句,它有兩個開始的parens,但只有一個關閉的paren。

一個WHERE類似這樣的條款可能會返回(或計數)的所有行:

WHERE (sport ILIKE '%%') 

Type casts for SQL queries? How’s that gonna work?

標準SQL有CAST()函數。骷髏語法

CAST (expression AS type) 

因此,舉例來說,你可以寫

CAST (<any timestamp> AS DATE) 

改變時間戳爲日期數據類型,或

CAST ('32' AS INTEGER) 

改變字符串 '32'到整數32。

In my migration the database field looks like this:

t.boolean :sporty 

如果列 「運動」 是布爾型,這是你真正的問題。如果您嘗試在布爾值上使用字符串比較(您做過:WHERE((運動ILIKE'%%')),您將看到您看到的錯誤消息。您希望語句看起來更像這樣:

SELECT COUNT(*) FROM "customers" WHERE sporty; 
SELECT COUNT(*) FROM "customers" WHERE sporty = true; 

SELECT COUNT(*) FROM "customers" WHERE NOT sporty; 
SELECT COUNT(*) FROM "customers" WHERE sporty = false; 
+0

謝謝您的回答:-)。我相應地修改了我的查詢。但現在我得到這個錯誤:PGError:錯誤:無效的輸入語法類型布爾:「」。現在怎麼辦? : -/ – 2011-01-20 14:52:23