Skip to content

Commit 67bd110

Browse files
committed
doc: update json.sgml等
1 parent e036237 commit 67bd110

File tree

1 file changed

+75
-3
lines changed

1 file changed

+75
-3
lines changed

postgresql/doc/src/sgml/json.sgml

Lines changed: 75 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ ____________________________________________________________________________-->
127127
</para>
128128
____________________________________________________________________________-->
129129
<para>
130-
RFC 7159 指定 JSON 字符串应以 UTF8 编码。因此 JSON 类型不可能严格遵守 JSON 规范,除非数据库编码
130+
<acronym>RFC</acronym> 7159 指定 JSON 字符串应以 UTF8 编码。因此 JSON 类型不可能严格遵守 JSON 规范,除非数据库编码
131131
是 UTF8。尝试直接包括数据库编码中无法表示的字符将会失败。反过来,能
132132
在数据库编码中表示但是不在 UTF8 中的字符是被允许的。
133133
</para>
@@ -151,7 +151,7 @@ ____________________________________________________________________________-->
151151
</para>
152152
____________________________________________________________________________-->
153153
<para>
154-
RFC 7159 允许 JSON 字符串包含<literal>\u<replaceable>XXXX</replaceable></literal>
154+
<acronym>RFC</acronym> 7159 允许 JSON 字符串包含<literal>\u<replaceable>XXXX</replaceable></literal>
155155
所标记的 Unicode 转义序列。在<type>json</type>类型的输入函数中,不管数据库
156156
编码如何都允许 Unicode 转义,并且只检查语法正确性(即,跟在<literal>\u</literal>
157157
后面的四个十六进制位)。但是,<type>jsonb</type>的输入函数更加严格:它不允许对无法在数据库
@@ -956,7 +956,7 @@ ____________________________________________________________________________-->
956956
SELECT jdoc->'guid', jdoc->'name' FROM api WHERE jdoc @@ '$.tags[*] == "qui"';
957957
</programlisting>
958958
<programlisting>
959-
SELECT jdoc->'guid', jdoc->'name' FROM api WHERE jdoc @? '$.tags[*] ? (@ == "qui")';
959+
SELECT jdoc->'guid', jdoc->'name' FROM api WHERE jdoc @@ '$.tags[*] ? (@ == "qui")';
960960
</programlisting>
961961
GIN 索引从<literal>jsonpath</literal>中提取如下格式的语句: <replaceable>accessors_chain</replaceable> = <replaceable>const</replaceable>。
962962
存取器链可能由<literal>.key</literal><literal>[*]</literal>, 和 <literal>[<replaceable>index</replaceable>]</literal> 存取器组成。
@@ -1152,6 +1152,78 @@ ____________________________________________________________________________-->
11521152
</para>
11531153
</sect2>
11541154

1155+
<sect2 id="jsonb-subscripting">
1156+
<title><type>jsonb</type> 下标</title>
1157+
<para>
1158+
<type>jsonb</type> 数据类型支持用于检索和修改元素的数组样式索引。 嵌套值与 <literal>jsonb_set</literal> 函数中<literal>path</literal>参数规则相同,可以被链式下标表达式指定。如果<type>jsonb</type>
1159+
类型的值是一个数组,数值下标从零开始,负整数从数组的最后的元素倒数。 不支持切片表达式。下标表达式的结果始终是 jsonb 数据类型。
1160+
</para>
1161+
1162+
<para>
1163+
<command>UPDATE</command> 语句或许在
1164+
<literal>SET</literal> 子句中使用下标来修改 <type>jsonb</type> 值。下标路径必须对它存在范围内的所有受影响的值都是可遍历的。 例如,<literal>val</literal>,<literal>val['a']</literal>,和 <literal>val['a']['b']</literal>如果每个路径都是一个对象, 则<literal>val['a']['b']['c']</literal>路径可以一直被遍历访问到 <literal>c</literal>, 如果 <literal>val['a']</literal> 或者 <literal>val['a']['b']</literal>
1165+
中任何一个没有定义, 将创建为空对象并根据需要进行填充。 但是, 如果 <literal>val</literal> 本身或者其中任何一个中间值被定义为非对象, 例如 字符串, 数字,或者<literal>jsonb</literal> <literal>null</literal>等,将无法访问并发生错误,事务将中止。
1166+
</para>
1167+
1168+
<para>
1169+
下标语法的例子:
1170+
1171+
<programlisting>
1172+
1173+
-- -- 通过键获取对象值
1174+
SELECT ('{"a": 1}'::jsonb)['a'];
1175+
1176+
-- 通过键路径提取嵌套对象的值
1177+
SELECT ('{"a": {"b": {"c": 1}}}'::jsonb)['a']['b']['c'];
1178+
1179+
-- 通过索引获取数组元素
1180+
SELECT ('[1, "2", null]'::jsonb)[1];
1181+
1182+
-- 按键更新对象值。请注意“1”周围的单引号。
1183+
-- 赋值的值也必须是jsonb类型
1184+
UPDATE table_name SET jsonb_field['key'] = '1';
1185+
1186+
-- 如果 jsonb_field['a']['b'] 中的任何数据不是对象,这将导致错误。
1187+
-- 例如,值 {"a": 1} 具有键 'a' 的数值。
1188+
UPDATE table_name SET jsonb_field['a']['b']['c'] = '1';
1189+
1190+
-- 在 WHERE 子句中使用下标过滤数据。
1191+
-- 由于下标的结果是jsonb,所以要与之比较的值也一定是jsonb。
1192+
-- 双引号还使“值”成为有效的 jsonb 字符串。
1193+
SELECT * FROM table_name WHERE jsonb_field['key'] = '"value"';
1194+
</programlisting>
1195+
1196+
<type>jsonb</type>不同于 <literal>jsonb_set</literal>,通过下标赋值处理边界情况. 当源值 <type>jsonb</type>
1197+
是 <literal>NULL</literal>时, 赋值通过下标处理,
1198+
好像是空JSON值 类型(对象或数组)隐含在下标键中:
1199+
1200+
<programlisting>
1201+
-- 如果 jsonb_field 为 NULL,返回结果将是 {"a": 1}
1202+
UPDATE table_name SET jsonb_field['a'] = '1';
1203+
1204+
-- 如果 jsonb_field 为 NULL,返回结果将是 [1]
1205+
UPDATE table_name SET jsonb_field[0] = '1';
1206+
</programlisting>
1207+
如果您为缺少元素的数组指定索引,则会添加<literal>NULL</literal> 元素, 直到索引可达并且可以设置值。
1208+
<programlisting>
1209+
-- 如果 jsonb_field 是 [] 返回结果是 [null, null, 2],
1210+
-- 如果 jsonb_field 是 [0],返回结果是 [0, null, 2]
1211+
UPDATE table_name SET jsonb_field[2] = '2';
1212+
</programlisting>
1213+
1214+
<type>jsonb</type> 值接受赋值给不存在的下标路径,只要最后一个可以被访问到的元素是一个对象或者数组 ,正如相应的下标所暗示的那样。(没有访问到路径中最后一个下标指定的元素,可能是任何值)创建嵌套数组或对象结构,如在前面的例子中,指定的下标路径用 <literal>null</literal>填充
1215+
1216+
<programlisting>
1217+
-- 如果 jsonb_field 是 {},返回结果是 {"a": [{"b": 1}]}
1218+
UPDATE table_name SET jsonb_field['a'][0]['b'] = '1';
1219+
1220+
-- 如果 jsonb_field 为 [],返回结果是 [null, {"a": 1}]
1221+
UPDATE table_name SET jsonb_field[1]['a'] = '1';
1222+
</programlisting>
1223+
1224+
</para>
1225+
</sect2>
1226+
11551227
<sect2>
11561228
<!--==========================orignal english content==========================
11571229
<title>Transforms</title>

0 commit comments

Comments
 (0)