PGError:ERROR:运算符不存在:boolean ~~ * unknown

时间:2011-01-20 01:58:11

标签: postgresql ruby-on-rails-3 sqlite heroku

本地我正在使用SQLite开发,但在我的生产主机上我正在运行PostgreSQL。在本地一切都很好,但在生产主机上却不是这样。

我已经建立了一种搜索表单,我可以用我喜欢的任何组合来评估数据库中的所有数据。只要我不使用布尔和/或日期字段,这似乎工作正常。 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的更严格的评价导致了麻烦。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:5)

直接回答接近底部。 。

  

评估为

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

为什么这样呢?为什么'%%'?

在SQL中,'%'是通配符。但是你的问题似乎是你正在构建一个WHERE子句,它有两个开放的parens,但只有一个关闭paren。

像这样的WHERE子句可能会返回(或计算)所有行:

WHERE (sport ILIKE '%%')
  

为SQL查询键入强制转换?怎么样   会工作吗?

标准SQL具有CAST()函数。骨架语法是

CAST (expression AS type)

所以,例如,你可以写

CAST (<any timestamp> AS DATE) 

将时间戳更改为日期数据类型,或

CAST ('32' AS INTEGER)

将字符串'32'更改为整数32。

  

在我的数据库字段迁移中   看起来像这样:

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;