标签: json

使用触发器在插入或更新时将列与 json 列中的字段同步

我是一个数据库/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)

postgresql trigger plpgsql json postgresql-9.4

5
推荐指数
1
解决办法
5032
查看次数

Postgres - 如何从一个字段中获取它在数组中的每个 json 上重复的所有值?

我正在以 jsonb 格式在 PostgreSQL 9.5 上的某些网站上存储大量 json。其中一个字段是一组具有相同信息的 Json。这是一个例子。

[
  {
    "text": "JIMIN",
    "indices": [
      16,
      22
    ]
  },
  {
    "text": "PUMA",
    "indices": [
      23,
      28
    ]
  }
]
Run Code Online (Sandbox Code Playgroud)

我想检索所有text值,也就是说,我想进行一个查询,在这个例子中给我JIMINPUMA。我找不到使用公共运算符(如#>>)来实现这一目标的方法。有没有办法做到这一点?

postgresql json

5
推荐指数
1
解决办法
7443
查看次数

将转义的双引号插入 MySQL JSON 字段

我正在尝试插入一个字符串化的 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)

mysql insert json mysql-5.7

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

自联接查询中的 JSON 聚合

我在 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)

sql-server aggregate json

5
推荐指数
1
解决办法
2462
查看次数

PostgreSQL 9.4 深度合并 jsonb 值

要求和情况

我们目前正在使用 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)

postgresql json postgresql-9.4

5
推荐指数
1
解决办法
5929
查看次数

SQL Server 2016 可以从 JSON 中提取节点名称吗?

我想从在 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)

t-sql json sql-server-2016

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

如何对 JSONB 列中的单个值实现全文搜索?

我有一张表,用于存储两个人之间的对话。

数据将如下所示:

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列创建索引?

postgresql index full-text-search json

5
推荐指数
1
解决办法
2583
查看次数

PostgreSQL 将未定义的 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 的所有键上进行选择而无需手动指定键?

postgresql select json

5
推荐指数
1
解决办法
2777
查看次数

Postgres 按 Json 数组排序

我有以下 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。

postgresql json postgresql-9.6

5
推荐指数
1
解决办法
7187
查看次数

在 JSONB 记录数组中查找包含键的行

我正在尝试查询对象数组中存在的键。这种结构:

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 万条记录才能添加这些值。

请给我指明一个方向。

postgresql index array json json-path

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