【问题标题】:ActiveRecord - Search Postgres array with multiple values?ActiveRecord - 搜索具有多个值的 Postgres 数组?
【发布时间】:2014-09-11 20:34:31
【问题描述】:

来自this tip,我看到我可以搜索具有奇异值的 Postgres 数组,所以:

User.where("'foo@bar.com' = ANY (emails)")

不过,我想知道如何搜索多个值,例如:

User.where("['foo@bar.com', 'bar@foo.com'] = ANY (emails)")

导致PG::SyntaxError

我正在使用 Activerecord 4.1.1

【问题讨论】:

  • 你试过('foo@bar.com', 'bar@foo.com')吗?
  • 是的,我收到了ActiveRecord::StatementInvalid: PG::DatatypeMismatch: ERROR: argument of WHERE must be type boolean, not type record
  • 试试where("ANY (emails) IN ('foo@bar.com', 'bar@foo.com'))" 或者where("IN ('foo@bar.com', 'bar@foo.com') ANY (emails))"
  • :(第一个似乎永远运行直到被中断,没有产生任何结果,而第二个产生ActiveRecord::StatementInvalid: PG::SyntaxError: ERROR: syntax error at or near "IN"

标签: postgresql activerecord sinatra


【解决方案1】:

您需要 PostgreSQL 数组重叠或数组包含运算符,具体取决于您是否需要 AND 或 OR-like 行为。

SELECT ARRAY['foo@bar.com', 'bar@foo.com'] @@ emails FROM ...

SELECT ARRAY['foo@bar.com', 'bar@foo.com'] <@ emails FROM ...

让 Rails 发出 PostgreSQL 数组字面量希望相当容易,但超出了我几乎为零的 Rails-fu。

如果emails 的类型是varchar[] 而不是text[],那么您也需要将数组字面量转换为varchar,例如

SELECT ARRAY['foo@bar.com', 'bar@foo.com']::varchar[] <@ emails FROM ...

要独立测试功能,您可以评估独立表达式,例如

regress=> SELECT ARRAY['foo@bar.com', 'bar@foo.com'] <@ ARRAY['foo@bar.com', 'bar@foo.com', 'fred'];
 ?column? 
----------
 t
(1 row)

【讨论】:

  • 嗨 Craig,调用 ActiveRecord::Base.connection.execute(sql) 会返回一个数组,但我对如何让这个原始 sql 语句正常工作感到困惑。一般来说,当我尝试按照SELECT ARRAY['foo@bar.com', 'bar@foo.com'] &lt;@ emails FROM users; 执行某些操作时,我会得到HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
  • @waffl 为我工作 - SELECT ARRAY['foo@bar.com', 'bar@foo.com'] &lt;@ ARRAY['foo@bar.com', 'bar@foo.com', 'fred'];emails 是什么数据类型? (您遗漏的消息的前半部分通常会告诉您这一点)。也许你需要一个演员; Pg 不会隐式转换数组类型。或者您使用的是旧版本?
  • 当我尝试运行没有FROM 的语句时,我得到missing FROM-clause entry for table... 该字段是character varying(255)[]
  • @waffl 好的,所以你必须将输入数组转换为varchar[],例如ARRAY['a', 'b']::varchar[].
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多