我需要检索表中的所有行,其中2列组合都是不同的.因此,我希望所有在同一天没有任何其他销售的销售以相同的价格出售.基于日期和价格的唯一销售将更新为活动状态.
所以我在想:
UPDATE sales
SET status = 'ACTIVE'
WHERE id IN (SELECT DISTINCT (saleprice, saledate), id, count(id)
FROM sales
HAVING count = 1)
Run Code Online (Sandbox Code Playgroud)
但是我的大脑比那更远了.
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
我试图将密钥附加到postgres中的嵌套jsonb中,但是出现错误。本质上,我从一个json开始:
{"tel": "123", "name": "foo", "new_info": {"a": "bar"}}
Run Code Online (Sandbox Code Playgroud)
并且我想附加{"b", "baz"}到“ new_info”中,使得结果jsonb为:
{"tel": "123", "name": "foo", "new_info": {"a": "bar", "b":"baz"}}
Run Code Online (Sandbox Code Playgroud)
我正在使用以下命令来获取原始的jsonb:
CREATE TABLE mytable (
ID serial NOT NULL PRIMARY KEY,
data jsonb NOT NULL
);
INSERT INTO mytable (data)
VALUES
(
'{ "name": "foo", "tel": "123"}'
);
UPDATE mytable SET data = jsonb_set(data, '{new_info}', '{"a":"bar"}', TRUE) WHERE data @> '{"name": "foo"}' ;
Run Code Online (Sandbox Code Playgroud)
并尝试使用以下命令来更新“ new_info”,该方法将不起作用:
WITH orig_new_info AS (SELECT data#>'{new_info}' FROM mytable WHERE data @> '{"name": "foo"}')
WITH updated_new_info …Run Code Online (Sandbox Code Playgroud)