我是一个数据库/postgres 初学者,所以请耐心等待。
如果我有一张桌子,就像这样。
CREATE TABLE testy (
id INTEGER REFERENCES other_table,
name varchar(128) PRIMARY KEY,
json JSONB NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
我在寻找插入或更新,将设置列之前创建一个触发器id,并name与在相同名称字段的值json。
因此,例如,如果testy包含以下内容UPDATE testy SET json = '{"id":2,"name":"jim"}' WHERE id = 1并被调用。
id | name | json
---+------+-----
1 | "jim"| {"id":1,"name":"jim"}
Run Code Online (Sandbox Code Playgroud)
想要的结果是
id | name | json
---+------+-----
2 | "jim"| {"id":2,"name":"jim"}
Run Code Online (Sandbox Code Playgroud)
我希望使其相当通用,因此不需要对列名进行硬编码。如果相应的 json 字段不存在,则将该列设置为 NULL 即可。到目前为止我有
CREATE TABLE testy_index (
id INTEGER PRIMARY KEY
);
INSERT INTO testy_index VALUES …Run Code Online (Sandbox Code Playgroud) 我正在以 jsonb 格式在 PostgreSQL 9.5 上的某些网站上存储大量 json。其中一个字段是一组具有相同信息的 Json。这是一个例子。
[
{
"text": "JIMIN",
"indices": [
16,
22
]
},
{
"text": "PUMA",
"indices": [
23,
28
]
}
]
Run Code Online (Sandbox Code Playgroud)
我想检索所有text值,也就是说,我想进行一个查询,在这个例子中给我JIMIN和PUMA。我找不到使用公共运算符(如#>>)来实现这一目标的方法。有没有办法做到这一点?
我正在尝试插入一个字符串化的 JSON,如下所示:
'{"test": "string with \"escaped quotes\" does not work"}'
Run Code Online (Sandbox Code Playgroud)
进入 MySQL JSON 字段,但我总是收到错误消息:
SQL 错误 (3140):无效的 JSON 文本:“对象成员后缺少逗号或‘}’。”
在值(或列)中的位置 24 '{"test": "带有"转义引号"的字符串不起作用"}'。
知道什么可能导致问题吗?
完整的INSERT声明是:
INSERT INTO test(json_test)
VALUES ('{"test": "string with \"escaped quotes\" does not work"}');
Run Code Online (Sandbox Code Playgroud) 我在 SQL Server 中有一个数据库。我需要对表本身进行连接查询,menutable.
但是,结果集中完全没有左表。我只从正确的表中得到结果。
此外,我无法像在 PostgreSQL 中那样将右表聚合到类似对象的数组中,并且不能有group byed左表 id结果集,我group by用于左表 id。
我可以在 PostgreSQL 中实现这一点我执行以下查询并得到我期望和想要的。我使用 PostgreSQL 的json_agg聚合函数:
select mt1.*, json_agg(mt2.*)
from menutable mt1
join menutable mt2 on mt1.id = mt2.üstmenuid
group by mt1.id;
Run Code Online (Sandbox Code Playgroud)
结果:
{
"results": [
{
"id": 4,
"menuadi": "Ortak Haberler",
"üstmenuid": null,
"json_agg": [
{
"id": 5,
"menuadi": "Lorem ipsum dolor sit amet, consectetur adipiscing elit",
"üstmenuid": 4
}, …Run Code Online (Sandbox Code Playgroud) 我们目前正在使用 JSONB 列来加速我们数据库中的任意搜索,并且到目前为止工作正常。更新数据时,要求如下:
为了说明这一点,请考虑以下示例:
现有(为了说明目的包含空值):
{
"a":null,
"b":1,
"c":1,
"f":1,
"g": {
"nested": 1
}
}
Run Code Online (Sandbox Code Playgroud)
这应该合并到现有对象中:
{
"b":2,
"d":null,
"e":2,
"f":null,
"g":{
"nested": 2
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我们覆盖了一些字段并删除了f. 所以预期的输出是:
{
"b": 2, //overridden
"c": 1, //kept
"e": 2, //added
"g": {
"nested": 2 //overridden
}
}
Run Code Online (Sandbox Code Playgroud)
为了实现这一点,我们使用以下函数:
CREATE OR REPLACE FUNCTION jsonb_merge(jsonb1 JSONB, jsonb2 JSONB)
RETURNS JSONB LANGUAGE sql IMMUTABLE
AS $$
SELECT
CASE
WHEN jsonb_typeof($1) = 'object' AND jsonb_typeof($2) = 'object' THEN
( …Run Code Online (Sandbox Code Playgroud) 我想从在 SQL Server 2016 中存储为 nvarchar 值的任何任意的、格式良好的 JSON 文档中提取节点名称及其路径的完整列表。有没有可靠的方法来做到这一点?
例如,对于 json 值:
DECLARE @json_doc nvarchar(4000) = '{"Name1":"Value1", "Name2":"Value2"}'
Run Code Online (Sandbox Code Playgroud)
查询@json_doc 时得到这个结果:
NODE_NAME
$.Name1
$.Name2
Run Code Online (Sandbox Code Playgroud) 我有一张表,用于存储两个人之间的对话。
数据将如下所示:
CREATE TABLE foo
AS
SELECT $$[
{ "user": 1, "timestamp": 1, "message": "First message" },
{ "user": 2, "timestamp": 2, "message": "Second message" },
{ "user": 2, "timestamp": 3, "message": "Debounced message from same user" },
{ "user": 1, "timestamp": 4, "message": "Last message" }
]$$::jsonb AS jsondata;
Run Code Online (Sandbox Code Playgroud)
我从不需要单独查找每条消息,所以我只想将整个对话存储在一个jsonb字段中。我需要对所有消息执行全文搜索。
我的第一个想法是创建一个新的文本列,将所有消息连接到一个长字符串中,然后在该列上创建一个三元组 GIN 索引。
这似乎是一种浪费大量空间的 hack,所以我想避免中间列。如何直接从jsonb列创建索引?
我有一个类型为字段的表jsonb,我想为所有 json 键拆分字段 jsonb 的列。此列缺少架构。例如:
从
CREATE TABLE v(id,jsonb)
AS VALUES
(1,'{"a":"4", "b":"5"}'::jsonb),
(2,'{}'),
(3,'{"a":"8", "c":"9", "d":"9"}');
Run Code Online (Sandbox Code Playgroud)
到
id | a | b | c | d
1 | 4 | 5 | |
3 | 8 | | 9 | 9
Run Code Online (Sandbox Code Playgroud)
对于这种特定情况,一种解决方案是
select * from table, json_to_record(optional) as x("a" text, "b" text, "c" text, d text)
Run Code Online (Sandbox Code Playgroud)
如您所见,键可能会有所不同,并且在大型数据库中很难将所有键都放在我的实际问题中,我有 31 个键,另一方面,如果我想在其他表中重用此脚本,我必须手动填充键。
有没有办法在 jsonb 的所有键上进行选择而无需手动指定键?
我有以下 json 存储在 jsonb 字段中。对于代表产品的每条记录,它包含各种类别,每个类别中的 a 是优先级。
[
{
"priority": 0,
"description": "",
"categoryName": "Cars",
"title": ""
},
{
"priority": 1,
"description": "",
"categoryName": "Trucks",
"title": ""
},
{
"priority": 2,
"description": "",
"categoryName": "Vans",
"title": ""
}
]
Run Code Online (Sandbox Code Playgroud)
我想使用优先级字段动态地按各种类别对数据进行排序,这样,如果我显示类别 Cars 中的所有产品,我将按 0 数组元素排序,如果我显示类别 Vans 中的所有产品, 我按 2 数组元素排序。
目前,要按第一个数组元素排序,我可以这样做:
ORDER BY OBJECT_DATA->'productCategories'->0->>'priority'
Run Code Online (Sandbox Code Playgroud)
但是,我想通过首先选择数组值 ( categoryName) 然后使用数组值来选择其优先级来排序。
例如:按卡车排序->优先级 (1)
我正在使用 PostgresSQL 9.6。
我正在尝试查询对象数组中存在的键。这种结构:
column jdata
{"name": "Somedata",
"array": [ {"name":"bla1", "attr": "somevalue"},
{"name":"bla2", "otherdata": "somevalue2"},
{"name":"bla3", "otherdata": "somevalue"}
],
"otherstuff": "stuff"
}
Run Code Online (Sandbox Code Playgroud)
现在我在jdata->'name'or上做 btree (jdata->'datetime')::cast,效果很好。
我也做 json_path_opsjdata->'array' @> '[{"name":"bla3"}]'真正的魅力所在。
我的问题是attr键可以在数组中的任何对象中,如果键存在,我关心记录,但是值几乎可以是任何东西。有没有办法查询这个?有没有办法索引它?我想做jdata->'array' @> '[{"attr": ?}]'或者也许? 'attr'可以在数组中以某种方式使用?
目前我正在考虑一个扫描键的触发器,然后将它移动到一个带有 true 或 false 或其他什么的标题,然后一个普通的 btree 将工作。有没有更好的办法?我需要在平均站点上编辑大约 50 万条记录才能添加这些值。
请给我指明一个方向。