zoukankan      html  css  js  c++  java
  • PG的json类型

    1、json分成json(纯字符串)和jsonb(二进制)

    2、查询json

    CREATE TABLE "test"."test_json1" (
      "id" serial2,
      "name" json,
      PRIMARY KEY ("id")
    );
    INSERT INTO "test_json1" ("name")  VALUES('{"col1":2,"col2":"fp","col3":"male"}') ;
    INSERT INTO "test_json1" ("name")  VALUES('{"col1":1,"col2":"francs","col3":"female"}')

    通过“->”操作符可以查询json 数据的键值:

    SELECT name->'col2' FROM test_json1 WHERE id=1
    结果:
    ?column?
    ” fra ncs ”

    返回文本格式:

    SELECT name ->> ’col2FROM test_sonl WHERE id=l ;
    结果: ?
    column? francs

    3、json和jsonb的差异

    PostgreSQL 支持两种JSON 数据类型: json 和jsonb ,两种类型在使用上几乎完全相同,两者主要区别为以下: json 存储格式为文本而jsonb 存储格式为二进制,由于存储格式的不同使得两种json 数据类型的处理效率不一样, json 类型以文本存储并且存储的内容和输人
    数据一样,当检索json 数据时必须重新解析,而jsonb 以二进制形式存储已解析好的数据,当检索jsonb 数据时不需要重新解析,因此json 写人比jsonb 快,但检索比jsonb 慢。

    (1)jsonb 输出的键的顺序和输入不一样,而json 的输出键的顺序和输入完全一样。

    (2)jsonb 类型会去掉输入数据中键值的空格,而json是保持原样

    因此 在大多数应用场景下建议使用jsonb ,除非有特殊的需求,比如对json 的键顺序有特殊的要求

    4、json和jsonb操作符

    (1)返回文本格式应【->>】

      (2) 字符串是否作为顶层键值 【?】

    SELECT  ' { "a":1 , "b":2}':: jsonb ? 'a'
    ?column?
    t

    (3)删除json 数据的键/值 【-】

    SELECT  ' { "a":1 , "b":2}':: jsonb - 'a'

    ?column 。
    { ” b ” : 2}

    5、 jsonb 与json 函数,最常用的

    (1)扩展最外层的json 对象成为一组键/值结果集【json_each】

    SELECT * FROM json_each('{"a":"foo","b":"bar"}');
    
    key I value
    --------+-------
    a I ” fo 。”
    b I ” bar”

    (2)返回文本形式【json each text】

    SELECT * FROM json_each_text('{"a":"foo","b":"bar"}');
    
    key I value
    --------+-------
    a I foo
    b I bar

    (3)【row_to j son()函数】【json object keys】

    SELECT row_to_json(test_json1) from test_json1 WHERE id=1

    SELECT * FROM json_object_keys('{"a":"foo","b":"bar"}');

    6、jsonb 键/值的追加、删除、更新

    (1)jsonb 键/值追加可通过“||”操作符

    SELECT '{"name":"francs","age":"31"}' :: jsonb || '{"sex":"male"}'::jsonb;

    {"age": "31", "sex": "male", "name": "francs"}

    (2)jsonb 键/值的删除有两种方法,一种是通过操作符【-】删除,另一种通过【#-】删除指定键/值

    SELECT '{"name":"francs","age":"31"}' :: jsonb - 'age'
    
    {"name": "francs"}

    操作符【#-】删除指定键/值,通常用于有嵌套json 数据删除的场景,如下代码删除嵌套contact 中的fax 键/值:

    SELECT '{"name":"francs","age":"31","contact":{"phone":"1390101110","fax":"010-88657890"}}' :: jsonb #-  '{contact,fax}' ::text[];
    
    {"age": "31", "name": "francs", "contact": {"phone": "1390101110"}}

    也可以指定位置如1的键值:
    SELECT '{"name":"francs","age":"31","contact":{"phone":"1390101110","fax":"010-88657890"}}' :: jsonb #-  '{contact,1}' ::text[]

     (2)jsonb更新

    【||】和函数【jsonb_set(target jsonb, path text[], new_value jsonb[, create_missing boolean])】

    函数jsonb_set(target jsonb, path text[], new_value jsonb[, create_missing boolean])的说明:

    target 指源jsonb 数据, path 指路径, new_value 指更新后的键值, creat_missing 值为true 表示如果键不存在则添加, create_missing 值为false 表示如果键不存在则不添加

  • 相关阅读:
    Java NIO中的缓冲区Buffer(二)创建/复制缓冲区
    Java NIO中的缓冲区Buffer(一)缓冲区基础
    Java中的反射
    Java SE 9(JDK9)环境安装及交互式编程环境Jshell使用示例
    Spring Data JPA例子[基于Spring Boot、Mysql]
    Spring Session
    Spring Data Redis示例
    Spring IO Platform简介及示例
    使用Spring Boot开发 “Hello World” Web应用
    2017/01/13,今天正好是开通博客园一周年,谈谈自己的一些想法
  • 原文地址:https://www.cnblogs.com/usegear/p/15660868.html
Copyright © 2011-2022 走看看