相关疑难解决方法(0)

按JSON数组中的匹配数查询和排序

jsonb在Postgres 9.4和Rails 的列中使用JSON数组,我可以设置一个范围,返回包含传递给范围方法的数组中的任何元素的所有行- 如下所示:

scope :tagged, ->(tags) {
  where(["data->'tags' ?| ARRAY[:tags]", { tags: tags }])
}
Run Code Online (Sandbox Code Playgroud)

我还想根据数组中匹配元素的数量来排序结果.

我很欣赏我可能需要超出ActiveRecord的范围才能做到这一点,所以一个vanilla Postgres SQL的答案也很有帮助,但如果它可以包含在ActiveRecord中,那么它可以是一个可链的范围.

根据要求,这是一个示例表.(实际架构要复杂得多,但这就是我所关心的.)

 id |               data                
----+-----------------------------------
  1 | {"tags": ["foo", "bar", "baz"]}
  2 | {"tags": ["bish", "bash", "baz"]}
  3 |
  4 | {"tags": ["foo", "foo", "foo"]}
Run Code Online (Sandbox Code Playgroud)

用例是基于标签查找相关内容.更多匹配标签更相关,因此结果应按匹配数量排序.在Ruby中,我有一个这样的简单方法:

Page.tagged(['foo', 'bish', 'bash', 'baz']).all
Run Code Online (Sandbox Code Playgroud)

哪个应按以下顺序返回页面:2, 1, 4.

postgresql activerecord ruby-on-rails ruby-on-rails-4 postgresql-9.4

12
推荐指数
1
解决办法
1343
查看次数

如何在带有Rails的WHERE子句中使用ANY而不是IN?

我曾经有过如下查询:

MyModel.where(id: ids)
Run Code Online (Sandbox Code Playgroud)

哪个生成sql查询如:

SELECT "my_models".* FROM "my_models"
WHERE  "my_models"."id" IN (1, 28, 7, 8, 12)
Run Code Online (Sandbox Code Playgroud)

现在我想改为使用ANY而不是IN.我创造了这个:

MyModel.where("id = ANY(VALUES(#{ids.join '),('}))"
Run Code Online (Sandbox Code Playgroud)

现在,当我使用空数组时,ids = []我得到以下错误:

MyModel Load (53.0ms)  SELECT "my_models".* FROM "my_models"  WHERE (id = ANY(VALUES()))
ActiveRecord::JDBCError: org.postgresql.util.PSQLException: ERROR: syntax error at or near ")"
ActiveRecord::StatementInvalid: ActiveRecord::JDBCError: org.postgresql.util.PSQLException: ERROR: syntax error at or near ")"
Position: 75: SELECT "social_messages".* FROM "social_messages"  WHERE (id = ANY(VALUES()))
    from arjdbc/jdbc/RubyJdbcConnection.java:838:in `execute_query'
Run Code Online (Sandbox Code Playgroud)

sql postgresql activerecord ruby-on-rails-3 ruby-on-rails-4

11
推荐指数
1
解决办法
1万
查看次数

如何将自定义类型数组传递给Postgres函数

我有自定义类型

CREATE TYPE mytype as (id uuid, amount numeric(13,4));
Run Code Online (Sandbox Code Playgroud)

我想将它传递给具有以下签名的函数:

CREATE FUNCTION myschema.myfunction(id uuid, mytypes mytype[])
  RETURNS BOOLEAN AS...
Run Code Online (Sandbox Code Playgroud)

如何在postgres查询中调用它,并且不可避免地从PHP中调用?

php sql postgresql plpgsql postgresql-9.1

5
推荐指数
2
解决办法
2788
查看次数