当前位置: 首页 > 编程笔记 >

postgresql 使用JSONb运算符

俞飞鸣
2023-03-14
本文向大家介绍postgresql 使用JSONb运算符,包括了postgresql 使用JSONb运算符的使用技巧和注意事项,需要的朋友参考一下

示例

创建数据库和表

DROP DATABASE IF EXISTS books_db;
CREATE DATABASE books_db WITH ENCODING='UTF8' TEMPLATE template0;

DROP TABLE IF EXISTS books;

CREATE TABLE books (
  id SERIAL PRIMARY KEY,
  client TEXT NOT NULL,
  data JSONb NOT NULL
);

填充数据库

INSERT INTO books(client, data) values (
    'Joe', 
    '{ "title": "Siddhartha", "author": { "first_name": "Herman", "last_name": "Hesse" } }'
),(
    'Jenny', 
    '{ "title": "Dharma Bums", "author": { "first_name": "Jack", "last_name": "Kerouac" } }'
),(
    'Jenny', 
    '{ "title": "100 años de soledad", "author": { "first_name": "Gabo", "last_name": "Marquéz" } }'
);

让我们看一下表格中的所有内容:

SELECT * FROM books;

输出:

-> 运算符从JSON列中返回值

选择1列:

SELECT client, 
    data->'title' AS title
    FROM books;

输出:

选择2列:

SELECT client, 
   data->'title' AS title, data->'author' AS author
   FROM books;

输出:

-> 与 ->>

该->运算符返回原始JSON类型(可能是一个对象),而->>返回文本。

返回嵌套对象

您可以使用->返回一个嵌套对象,从而链接运算符:

SELECT client, 
   data->'author'->'last_name' AS author
   FROM books;

输出:

筛选

根据JSON中的值选择行:

 SELECT 
 client,
 data->'title' AS title
 FROM books
  WHERE data->'title' = '"Dharma Bums"';

注意WHERE使用的,->所以我们必须与JSON进行比较'"Dharma Bums"'

或者我们可以使用->>和比较'Dharma Bums'

输出:

嵌套过滤

根据嵌套JSON对象的值查找行:

SELECT 
 client,
 data->'title' AS title
 FROM books
  WHERE data->'author'->>'last_name' = 'Kerouac';

输出:

一个真实的例子

CREATE TABLE events (
  name varchar(200),
  visitor_id varchar(200),
  properties json,
  browser json
);

我们将在此表中存储事件,例如浏览量。每个事件都有属性,可以是任何属性(例如当前页面),还可以发送有关浏览器的信息(例如OS,屏幕分辨率等)。两者都是完全免费的形式,并且可能会随着时间的流逝而发生变化(因为我们认为需要跟踪更多的内容)。

INSERT INTO events (name, visitor_id, properties, browser) VALUES
(
  'pageview', '1',
  '{ "page": "/" }',
  '{ "name": "Chrome", "os": "Mac", "resolution": { "x": 1440, "y": 900 } }'
),(
  'pageview', '2',
  '{ "page": "/" }',
  '{ "name": "Firefox", "os": "Windows", "resolution": { "x": 1920, "y": 1200 } }'
),(
  'pageview', '1',
  '{ "page": "/account" }',
  '{ "name": "Chrome", "os": "Mac", "resolution": { "x": 1440, "y": 900 } }'
),(
  'purchase', '5',
  '{ "amount": 10 }',
  '{ "name": "Firefox", "os": "Windows", "resolution": { "x": 1024, "y": 768 } }'
),(
  'purchase', '15',
  '{ "amount": 200 }',
  '{ "name": "Firefox", "os": "Windows", "resolution": { "x": 1280, "y": 800 } }'
),(
  'purchase', '15',
  '{ "amount": 500 }',
  '{ "name": "Firefox", "os": "Windows", "resolution": { "x": 1280, "y": 800 } }'
);

现在让我们选择所有内容:

SELECT * FROM events;

输出:

JSON运算符+ PostgreSQL聚合函数

使用JSON运算符,结合传统的PostgreSQL聚合函数,我们可以提取所需的任何内容。您可以随意使用RDBMS。

  • 让我们看看浏览器的用法:

      SELECT browser->>'name' AS browser, 
       count(browser)
       FROM events
       GROUP BY browser->>'name';

输出:

  • 每位访客的总收入:

      SELECT visitor_id, SUM(CAST(properties->>'amount' AS integer)) AS total
     FROM events
     WHERE CAST(properties->>'amount' AS integer) > 0
     GROUP BY visitor_id;

输出:

  • 平均屏幕分辨率

      SELECT AVG(CAST(browser->'resolution'->>'x' AS integer)) AS width,
       AVG(CAST(browser->'resolution'->>'y' AS integer)) AS height
     FROM events;

输出:

此处和此处有更多示例和文档。

 类似资料:
  • 问题内容: 我正在寻找一种使用数组中的“ IN”子句查询postgres jsonb字段的方法。 假设我有一张桌子 我需要选择test_content数组中的label可能为或的行。 我试过了 但是当我想用包含扩展查询时,或者变得复杂… 我需要的是 jsonb运算符可以吗? 问题答案: 简短答案 您可以在横向联接中使用该函数,并在子句中的复杂表达式中使用其结果: 不同 当在单个行中的多个数组元素中

  • 主要内容:算术运算符,比较运算符,逻辑运算符,位运算符运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。 PostgreSQL 运算符是一个保留关键字或字符,一般用在 WHERE 语句中,作为过滤条件。 常见的运算符有: 算术运算符 比较运算符 逻辑运算符 按位运算符 算术运算符 假设变量 a 为 2,变量 b 为 3,则: 运算符 描述 实例 + 加 a + b 结果为 5 - 减 a - b 结果为 -1 * 乘 a * b 结果为 6 /

  • 在我的Java项目中,我是usinq、JOOQ,我希望更新JSONB值。但我的建造失败了。 我写了一段代码: 我收到了下一条信息: 我犯错的地方?

  • 我正在开发一个迁移软件,它将使用来自REST服务的未知数据。 我已经考虑过使用MongoDB,但我决定不使用它,而是使用PostgreSQL。 读完本文后,我试图在我的SpringBoot应用程序中使用SpringJPA实现它,但我不知道在我的实体中映射。 我试过了,但什么也不懂! 这里就是我所在的地方: 和... 下表: 我该怎么做? 注意:我不想/不需要一个实体来工作。我的JSON将永远是St

  • 问题内容: 使用运算符将产生以下结果: 我希望能够实现以下结果(对于操作员来说只是一个占位符): 因此,您可以看到顶级键的子值已“合并”,使得结果包含和。 如何在Postgres中“深度”合并两个 JSONB 值? 如果可能的话,这可能吗? 一个更复杂的测试用例: 原始“合并”并成为对象的另一个测试用例: 问题答案: 您应该合并两个值都使用的未嵌套元素。在不平凡的查询中执行此操作可能会感到不舒服,

  • 具有以下数据模型: 我需要将所有价格键更新为新名称cost。在静态字段上很容易做到这一点,使用: 结果: 但是我也需要在分解数组中做这些。 在不知道细分数组中的项目数的情况下,我如何做到这一点?换句话说,我如何在jsonb数组的每个元素上应用函数。 非常感谢。