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

Ulf*_*ose 4 sqlite postgresql heroku ruby-on-rails-3

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

我已经建立了一种搜索表单,我可以用我喜欢的任何组合来评估数据库中的所有数据.只要我不使用布尔和/或日期字段,这似乎工作正常.PostgreSQL似乎不太喜欢我的代码......

所以,这是一些示例代码:

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

这评估为

SELECT COUNT(*) FROM "customers" WHERE ((sporty ILIKE '%%') 
Run Code Online (Sandbox Code Playgroud)

无论如何,为什么呢?为什么 '%%'?

为了测试部署,我使用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
Run Code Online (Sandbox Code Playgroud)

在我正在创建此数据的表单中,我正在使用此代码

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

正如我已经提到的,SQLite是我的朋友,似乎是对PostgreSQL的更严格的评价导致了麻烦.

感谢您的帮助.

Mik*_*ll' 5

直接回答接近底部...

这评估为

SELECT COUNT(*) FROM "customers" WHERE ((sporty ILIKE '%%') 
Run Code Online (Sandbox Code Playgroud)

无论如何,为什么呢?为什么 '%%'?

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

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

WHERE (sport ILIKE '%%')
Run Code Online (Sandbox Code Playgroud)

为SQL查询键入强制转换?那怎么样?

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

CAST (expression AS type)
Run Code Online (Sandbox Code Playgroud)

所以,例如,你可以写

CAST (<any timestamp> AS DATE) 
Run Code Online (Sandbox Code Playgroud)

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

CAST ('32' AS INTEGER)
Run Code Online (Sandbox Code Playgroud)

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

在我的迁移中,数据库字段如下所示:

t.boolean :sporty
Run Code Online (Sandbox Code Playgroud)

如果列"运动"是布尔值,这是你真正的问题.如果您尝试使用一个布尔字符串比较(你没:WHERE((运动型ILIKE"%%")),你会得到你所看到的错误消息,你想的语句读起来更像这些:

SELECT COUNT(*) FROM "customers" WHERE sporty;
SELECT COUNT(*) FROM "customers" WHERE sporty = true;
Run Code Online (Sandbox Code Playgroud)

要么

SELECT COUNT(*) FROM "customers" WHERE NOT sporty;
SELECT COUNT(*) FROM "customers" WHERE sporty = false;
Run Code Online (Sandbox Code Playgroud)