本地我正在使用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的更严格的评价导致了麻烦。
提前感谢您的帮助。
答案 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;