https://www.postgresql.org/docs/9.3/functions-json.html
https://www.cnblogs.com/VicLiu/p/11940524.html
https://www.runoob.com/manual/PostgreSQL/index.html
基本用法
1、关键词和不被引号修饰的标识符是大小写不敏感的,一般关键字是大写,名称是小写
2、受限标识符或被引号修饰的标识符。它是由双引号("
)包围的一个任意字符序列。一个受限标识符总是一个标识符而不会是一个关键字
反斜线转义序列
转化数据类型
1、 使用两个::强制转化
2、 使用typename(‘内容转化’),但是不能转化为数组类型
Json和jsonb
Json和jsonb的区别:json
数据类型存储输入文本的精准拷贝,处理函数必须在每次执行时必须重新解析该数据。而jsonb
数据被存储在一种分解好的 二进制格式中,它在输入时要稍慢一些,因为需要做附加的转换。但是 jsonb
在处理时要快很多
json
类型存储的是输入文本的准确拷贝,其中可能会保留在语法 上不明显的、存在于记号之间的空格,还有 JSON 对象内部的键的顺序。还有, 如果一个值中的 JSON 对象包含同一个键超过一次,所有的键/值对都会被保留( 处理函数会把最后的值当作有效值)。相反,jsonb
不保留空格、不 保留对象键的顺序并且不保留重复的对象键。如果在输入中指定了重复的键,只有 最后一个值会被保留。
除非有特别特殊的需要(例如遗留的对象键顺序假设),大多数应用应该 更愿意把 JSON 数据存储为jsonb
jsonb
包含
@>
判断右边的元素是否包含在左边元素内
<@
判断右边是否包含左边元素
-- 简单的标量/基本值只包含相同的值:
SELECT '"foo"'::jsonb @> '"foo"'::jsonb;
-- 右边的数字被包含在左边的数组中:
SELECT '[1, 2, 3]'::jsonb @> '[1, 3]'::jsonb;
-- 数组元素的顺序没有意义,因此这个例子也返回真:
SELECT '[1, 2, 3]'::jsonb @> '[3, 1]'::jsonb;
-- 重复的数组元素也没有关系:
SELECT '[1, 2, 3]'::jsonb @> '[1, 2, 2]'::jsonb;
-- 右边具有一个单一键值对的对象被包含在左边的对象中:
SELECT '{"product": "PostgreSQL", "version": 9.4, "jsonb": true}'::jsonb @> '{"version": 9.4}'::jsonb;
-- 右边的数组不会被认为包含在左边的数组中,
-- 即使其中嵌入了一个相似的数组:
SELECT '[1, 2, [1, 3]]'::jsonb @> '[1, 3]'::jsonb; -- 得到假
-- 但是如果同样也有嵌套,包含就成立:
SELECT '[1, 2, [1, 3]]'::jsonb @> '[[1, 3]]'::jsonb;
-- 类似的,这个例子也不会被认为是包含:
SELECT '{"foo": {"bar": "baz"}}'::jsonb @> '{"bar": "baz"}'::jsonb; -- 得到假
-- 包含一个顶层键和一个空对象:
SELECT '{"foo": {"bar": "baz"}}'::jsonb @> '{"foo": {}}'::jsonb;
被包含的对象必须在结构和数据内容上匹配包含对象,这种匹配 可以是从包含对象中丢弃了不匹配的数组元素或者对象键值对之后成立。但是记住做包含匹配时数组元素的顺序是没有意义的,并且重复的数组元素实 际也只会考虑一次。结构必须匹配的一般原则有一种特殊情况,一个数组可以包含一个基本值
-- 这个数组包含基本字符串值为真:
SELECT '["foo", "bar"]'::jsonb @> '"bar"'::jsonb;
实例
1、判断林用户的attribute里是否含有level:normal这个属性,加上limit是因为子查询语句可能会查询出来多条导致该sql语句不生效
SELECT (SELECT "attributes" FROM sec_user WHERE display_name LIKE '%林用户%' ORDER BY create_time LIMIT 1) @> '{"level": "normal"}'::jsonb
2、查询attributes中创建app的是idc的总数
SELECT "count"(*) FROM sec_department WHERE "attributes"::jsonb @>'{"create_app": "identity-center"}'::jsonb
Jsonb
存在
它是包含的一种 变体:它测试一个字符串(以一个text
值的形式给出)是否出 现在jsonb
值顶层的一个对象键或者数组元素中
-- 字符串作为一个数组元素存在:
SELECT '["foo", "bar", "baz"]'::jsonb ? 'bar';
-- 字符串作为一个对象键存在:
SELECT '{"foo": "bar"}'::jsonb ? 'foo';
-- 不考虑对象值:
SELECT '{"foo": "bar"}'::jsonb ? 'bar'; -- 得到假
-- 和包含一样,存在必须在顶层匹配:
SELECT '{"foo": {"bar": "baz"}}'::jsonb ? 'bar'; -- 得到假
-- 如果一个字符串匹配一个基本 JSON 字符串,它就被认为存在:
SELECT '"foo"'::jsonb ? 'foo';