我已经定义了一个简单的表
create table resources (id serial primary key, fields jsonb);
Run Code Online (Sandbox Code Playgroud)
它包含带键的数据(从大集中绘制)和1到100之间的值,如:
id | fields
--------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1 | {"tex": 23, "blair": 46, "cubic": 50, "raider": 57, "retard": 53, "hoariest": 78, "suturing": 25, "apostolic": 22, "unloosing": 37, "flagellated": 85}
2 | {"egoist": 75, "poshest": 0, "annually": 19, "baptists": 29, "bicepses": 10, "eugenics": 9, "idolizes": 8, "spengler": 60, "scuppering": 13, "cliffhangers": 37}
3 | {"entails": 27, "hideout": 22, "horsing": 98, "abortions": 88, "microsoft": 37, "spectrums": 26, "dilettante": 52, "ringmaster": 84, "floweriness": 72, "vivekananda": …Run Code Online (Sandbox Code Playgroud) 我position在 JSONB 列中定义了一个键。
这些值被视为文本,因此以下查询
MyModel.order("data ->> 'position' ASC").each {|x| puts x.position}
Run Code Online (Sandbox Code Playgroud)
返回:
0
1
10
2
3
Run Code Online (Sandbox Code Playgroud)
我如何将其position视为整数并根据它对我的模型进行排序?
给定一个数据结构如下:
{"single":"someText", "many":["text1", text2"]}
Run Code Online (Sandbox Code Playgroud)
我可以查询单个正则表达式
WHERE JsonBColumn ->> 'single' ~ '^some.*'
Run Code Online (Sandbox Code Playgroud)
我可以查询数组上的包含匹配
WHERE JsonBColumn -> 'many' ? 'text2'
Run Code Online (Sandbox Code Playgroud)
我想做的是用 JArray 上的正则表达式进行包含匹配
WHERE JsonBColumn -> 'many' {Something} '.*2$'
Run Code Online (Sandbox Code Playgroud) 我正在掌握Postgres中的JSONB功能> = 9.5(并且喜欢它)但是遇到了绊脚石.我已经读过关于连接JSON字段的能力,所以'{"a":1}' || '{"b":2}'创建{"a":1,"b":2},但我想在多行的同一个字段中执行此操作.例如:
select row_concat_??(data) from table where field = 'value'
Run Code Online (Sandbox Code Playgroud)
我发现了jsonb_object_agg一个听起来像我想要的功能,除了文档显示它带有多个参数,而我只有一个.
有什么想法我会怎么做?jsonb_agg成功创建一个数组,感觉我真的很亲密.
理想情况下,我想运行一个查询,返回一个表,其中每一行都是指定表的列名,并且jsonb表中与该列对应的所有不同值的数组。
棘手的部分似乎是动态执行的,我可以只指定表而不是每个单独的列。
我可以从 中检索相关表的所有列名information_schema.columns,但是有没有一种简单的方法可以将其与查询结合起来以检索每列的所有不同值?
我试图弄清楚对象数组中特定字段的内联求和的查询语法是什么。我的数据结构如下
CREATE TABLE "orders" (
order_id int8,
tax_lines jsonb
);
INSERT INTO "orders"(order_id, tax_lines) VALUES (4521745668, '[
{
"rate": 0.029,
"price": "0.43",
"title": "CO State Tax"
},
{
"rate": 0.00985,
"price": "0.15",
"title": "Boulder County Tax"
},
{
"rate": 0.0496,
"price": "0.74",
"title": "Boulder Municipal Tax"
}
]');
Run Code Online (Sandbox Code Playgroud)
我想要达到的结果是
order_id cumulative_tax_rate
4521745668 .08845
Run Code Online (Sandbox Code Playgroud)
据我所知
SELECT
o.order_id,
SUM((jsonb_array_elements(o.tax_lines) ->> 'rate')::numeric) AS cumulative_tax_rate
FROM orders o WHERE o.order_id = '4521745668'
Run Code Online (Sandbox Code Playgroud)
但它一直要求使用我想避免的 GROUP BY 子句。我想知道是否可以在没有 group by 子句的情况下在行级别执行此聚合,如果可以,该语法可能是什么样子?
先感谢您。
我有一个名为cust_data的表,它存储id和JSON对象.我想编写postgres select语句来获取:
表:cust_data
id(numeric) | connections (jsonb)
------------------------------
1, {"Persons": [
{
"personName": "Tom",
"gender": "Male",
"country": "USA",
"status":"single"
},
{
"personName": "Harry",
"gender": "Male",
"country": "USA",
"status":"single"
},
{
"personName": "Lisa",
"gender": "Female",
"country": "Mexico",
"status":"single"
}
]
}
2,{
"Persons": [
{
"personName": "Lisa",
"gender": "Male",
"country": "UK",
"status":"single"
},
{
"personName": "Harry",
"gender": "Male",
"country": "USA",
"status":"single"
},
{
"personName": "Lisa",
"gender": "Female",
"country": "Mexico",
"status":"married"
}
]
}
3,{
"Persons": [
{
"personName": "Lisa", …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种仅更新jsonb列内嵌套键/值的方法。
这是User模型:
const User= sequelize.define('User', {
id: DataTypes.INTEGER,
name:DataTypes.STRING,
// other fields
data: DataTypes.JSONB
});
Run Code Online (Sandbox Code Playgroud)
当前data列值:
{
'email':{'verified':false,'token':'random token'},
'phone:{'verified':true}
}
Run Code Online (Sandbox Code Playgroud)
我想将email.verified属性更新为true使用单个 update查询。
我尝试了以下代码:
models.User.update({'data.email.verified':true},
{where:{id:1}}).then()...
models.User.update({data:{email:{verified:true}}},
{where:{id:1}}).then()...
Run Code Online (Sandbox Code Playgroud)
更新的列将是:
{
'email':{'verified':true},
}
Run Code Online (Sandbox Code Playgroud)
我也试过这个:
models.User.findById(1).then(user => {
user.set('data.email.verified', true);
user.save().then()...
});
Run Code Online (Sandbox Code Playgroud)
这有效,但我不想执行两个查询(选择然后更新)仅更新一个字段。
是否可以通过sequelize单个更新查询来执行此操作?
我需要运行一个接受整数和 JSONB 数据的函数。在普通控制台中,我会像这样运行它:
select my_func(0, '{"foo": "bar"}'::jsonb)
这就是我假设它在 SQLAlchemy 中工作的方式:
params = {'p1': 0, 'p2': JSONB('{"foo": "bar"}'))}
result = db.engine.execute(text('select my_func(:p1, :p2)'), params)
Run Code Online (Sandbox Code Playgroud)
但事实并非如此。我应该如何让 SQLAlchemy 理解我要插入的是 JSONB?
希望是一个非常简单的问题。我正在尝试根据我的 postgresql 查询在 Laravel 中创建一个查询,我很难转换这个特定的连接,因为它是使用 jsonb_to_recordset 的横向连接。
join lateral jsonb_to_recordset(gift_splits) as r("house_id" int, "amount" json) on true
Run Code Online (Sandbox Code Playgroud)
这是我迄今为止尝试过的,它说我的论点太少了。我知道它想要“a”、“=”、“b”,但我不确定如何将“on true”翻译为“on true”以及连接的横向方面。
->join(DB::raw("lateral jsonb_to_recordset(gift_splits) as r(house_id int, amount json)"), true)
Run Code Online (Sandbox Code Playgroud)
最后,我尝试将整个查询发布到 Model::raw(DB::raw("...) 中,但我遇到了很多小错误。我希望对我的实际问题提供反馈。
jsonb ×10
postgresql ×8
json ×3
arrays ×1
lateral-join ×1
php ×1
python ×1
regex ×1
sequelize.js ×1
sql ×1
sqlalchemy ×1
sum ×1