【问题标题】:PGError: ERROR: operator does not exist: boolean ~~* unknownPGError:错误:运算符不存在:布尔值~~*未知
【发布时间】:2011-06-12 04:23:47
【问题描述】:

我在本地使用 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 的更严格的评估导致了麻烦。

提前感谢您的帮助。

【问题讨论】:

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


    【解决方案1】:

    直接答案在底部附近。 . .

    计算结果为

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

    为什么会这样?为什么是“%%”?

    在 SQL 中,'%' 是通配符。但是您的问题似乎是您正在构建一个 WHERE 子句,它有两个左括号,但只有一个右括号。

    像这样的 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 ((sporty 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;
    

    【讨论】:

    • 感谢您的回答:-)。我相应地修改了我的查询。但是现在我收到了这个错误:PGError: ERROR: invalid input syntax for type boolean: ""。现在怎么办? :-/
    • @ulf:新的 SQL 语句是什么?
    • 新语句如下所示:“sporty = ?”离开 " 会导致应用程序崩溃。
    • WHERE sporty = true 会起作用。我在上面编辑了我的答案以包括这些替代方案。
    猜你喜欢
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 2013-03-02
    • 2012-09-20
    • 2012-08-08
    相关资源
    最近更新 更多