0

我在使用带有 postgres 的 rails 2 中的活动记录条件时遇到问题。我的问题是我何时尝试使用此查询(我正在使用 geokit,但这不是问题)

Table.all(:conditions => ["id IN (?)", id_array.join(",")], :origin => origin, :within => 20)

我遇到了这个问题:

ActiveRecord::StatementInvalid: PG::Error: ERROR:  invalid input syntax for integer: "21,28"
LINE X: ...OM "tables" WHERE (((id IN (E'21,28...

为什么将“E”放在那里以及如何摆脱它?

4

5 回答 5

3

使用id_array.join(","),您将单个字符串传递给函数。由于在生成的 SQL 查询中所有字符串都被转义并被单引号包围,因此您自然会得到 SQL 错误,因为在此IN语句中您只能使用逗号分隔的整数。

简单的解决方案是直接将数组传递给函数。ActiveRecord 然后自行在 SQL 中创建正确的值。你可以像这样使用它:

Table.all(:conditions => ["id IN (?)", id_array], :origin => origin, :within => 20)

或者,您可以使用这种更类似于 ruby​​ 的语法来生成完全相同的 SQL 查询:

Table.all(:conditions => {:id => id_array}, :origin => origin, :within => 20)
于 2012-06-07T19:52:38.567 回答
1

您已经被引导到不同的路径。但要回答你的问题:

为什么要在里面放“E”...

那是PostgreSQL 的转义字符串语法。PostgreSQL 的默认行为在 9.1 版本中发生了变化,不再解释反斜杠转义,除非E在开头的单引号前面有一个。新行为反映了 SQL 标准。

 'one backslash: \'  -- backslash has no special meaning in Postgres 9.1
E'one backslash: \\' -- must use E'' syntax to interpret escape sequences

一些客户端安全地使用它并将 放在每个E字符串文字的前面以获得相同的行为,而不管 PostgreSQL 版本或特定的设置。其他人向服务器询问设置并相应地调整语法。无论哪种方式,在不包含反斜杠的字符串文字前面放置一个(非常少的)CPU 周期都是一种浪费。standard_conforming_stringsE

于 2012-06-07T23:49:37.543 回答
0

我认为你不需要加入价值观。即使在 Rails 2 中。也就是说,试试这个:

Table.all(:conditions => ["id IN (?)", id_array], :origin => origin, :within => 20)
于 2012-06-07T19:51:53.920 回答
0

试试这个:

Table.all(:conditions => ["id IN (#{id_array.join(",")})"], :origin => origin, :within => 20
于 2012-06-07T19:52:02.647 回答
0

我在 mysql 尝试运行 count() 函数时遇到了同样的问题,我用来修复它的语法是

Issue.all(:conditions => "status_id IN (5, 15, 19, 21, 25)").count
于 2015-06-15T18:18:56.553 回答