=======================  JSON 函数和操作符 ======================= .. container:: sect1 :name: FUNCTIONS-JSON .. container:: titlepage .. container:: .. container:: .. rubric:: JSON 函数和操作符 :name: json-函数和操作符 :class: title .. container:: toc 本节描述: .. container:: itemizedlist - 用于处理和创建JSON数据的函数和运算器 - SQL/JSON路径语言 有关PostgreSQL中支持的JSON类型的详细信息,见 `JSON类型 `__\ 。 . .. container:: sect2 :name: FUNCTIONS-JSON-PROCESSING .. container:: titlepage .. container:: .. container:: .. rubric:: 处理和创建JSON数据 :name: 处理和创建json数据 :class: title `JSON函数 `__\ 展示了可以用于 JSON 数据类型(见\ `JSON类型 `__\ )的操作符。 .. container:: table :name: FUNCTIONS-JSON-OP-TABLE * ``json``\ 和\ ``jsonb`` 操作符** .. container:: table-contents +---------+----------+----------+----------+----------+----------+ | 操作符 | 右操 | 返回类型 | 描述 | 例子 | 例子结果 | | | 作数类型 | | | | | +=========+==========+==========+==========+==========+==========+ | ``->`` | ``int`` | ``json`` | 获得 | ``'[ | ``{"c": | | | | or | JSON | {"a":"fo | "baz"}`` | | | | | 数组元素 | o"},{"b" | | | | | ``jsonb``| (索引从 | :"bar"}, | | | | | | 0 | {"c":"ba | | | | | | 开 | z"}]'::j | | | | | | 始,负整 | son->2`` | | | | | | 数从末尾 | | | | | | | 开始计) | | | +---------+----------+----------+----------+----------+----------+ | ``->`` | ``text`` | ``json`` | 通 | ``' | ``{"b": | | | | or | 过键获得 | {"a": {" | "foo"}`` | | | | | JSON | b":"foo" | | | | | ``jsonb``| 对象域 | }}'::jso | | | | | | | n->'a'`` | | +---------+----------+----------+----------+----------+----------+ | ``->>`` | ``int`` | ``text`` | 以 | ``'[1,2 | ``3`` | | | | | ``text`` | ,3]'::js | | | | | | 形式获得 | on->>2`` | | | | | | JSON | | | | | | | 数组元素 | | | +---------+----------+----------+----------+----------+----------+ | ``->>`` | ``text`` | ``text`` | 以 | ``'{"a" | ``2`` | | | | | ``text`` | :1,"b":2 | | | | | | 形式获得 | }'::json | | | | | | JSON | ->>'b'`` | | | | | | 对象域 | | | +---------+----------+----------+----------+----------+----------+ | ``#>`` | ``text | ``json`` | 获取在指 | ``'{"a | ``{"c": | | | []`` | or | 定路径的 | ": {"b": | "foo"}`` | | | | | JSON | {"c": "f | | | | | ``jsonb``| 对象 | oo"}}}': | | | | | | | :json#>' | | | | | | | {a,b}'`` | | +---------+----------+----------+----------+----------+----------+ | ``#>>`` | ``text | ``text`` | 以 | ``'{"a" | ``3`` | | | []`` | | ``text`` | :[1,2,3] | | | | | | 形式 | ,"b":[4, | | | | | | 获取在指 | 5,6]}':: | | | | | | 定路径的 | json#>>' | | | | | | JSON | {a,2}'`` | | | | | | 对象 | | | +---------+----------+----------+----------+----------+----------+ .. note:: .. rubric:: 注意 :name: 注意 :class: title 对\ ``json``\ 和\ ``jsonb``\ 类型,这些操作符都有其并行变体。 域/元素/路径抽取操作符返回与其左手输入(\ ``json``\ 或\ ``jsonb``\ ) 相同的类型,不过那些被指定为返回\ ``text``\ 的除外,它们的返回值会被强制 为文本。如果该 JSON 输入没有匹配请求的正确结构(例如那样的元素不存在),这些 域/元素/路径抽取操作符会返回 NULL 而不是失败。 接受整数 JSON 数组下标的 域/元素/路径抽取操作符都支持表示从数组末尾开始的负值下标形式。 `行和数组比较 `__\ 中展示的标准比较操作符只对 ``jsonb``\ 有效,而不适合\ ``json``\ 。它们遵循在\ `JSON类型 `__\ 中给出的 B 树操作规则。 如\ `JSON函数 `__\ 中所示,还存在一些只适合 ``jsonb``\ 的操作符。这些操作符中的很多可以用\ ``jsonb`` 操作符类索引。\ ``jsonb``\ 包含和存在语义的完整描述可参见\ `JSON类型 `__\ 。\ `JSON类型 `__\ 描述了如何 用这些操作符来有效地索引\ ``jsonb``\ 数据。 .. container:: table :name: FUNCTIONS-JSONB-OP-TABLE **额外的\ ``jsonb``\ 操作符** .. container:: table-contents +--------+--------------+---------------------+---------------------+ | 操作符 | 右操作数类型 | 描述 | 例子 | +========+==============+=====================+=====================+ | ``@>`` | ``jsonb`` | 左边的 JSON | ``'{"a":1 | | | | 值是 | , "b":2}'::jsonb @> | | | | 否在顶层包含右边的 | '{"b":2}'::jsonb`` | | | | JSON 路径/值项? | | +--------+--------------+---------------------+---------------------+ | ``<@`` | ``jsonb`` | 左边的 JSON | ``'{"b":2 | | | | 路径/值项 | }'::jsonb <@ '{"a": | | | | 是否被包含在右边的 | 1, "b":2}'::jsonb`` | | | | JSON 值的顶层? | | +--------+--------------+---------------------+---------------------+ | ``?`` | ``text`` | 键/元素\ * | ``'{"a":1, "b" | | | | 字符串*\ 是否存在于 | :2}'::jsonb ? 'b'`` | | | | JSON 值的顶层? | | +--------+--------------+---------------------+---------------------+ | ``?|`` | ``text[]`` | 这些数组\ *字符 | ``'{"a":1, "b": | | | | 串*\ 中的任何一个是 | 2, "c":3}'::jsonb ? | | | | 否做为顶层键存在? | | array['b', 'c']`` | +--------+--------------+---------------------+---------------------+ | ``?&`` | ``text[]`` | 是否所有 | ``'[ | | | | 这些数组\ *字符串*\ | "a", "b"]'::jsonb ? | | | | 都作为顶层键存在? | & array['a', 'b']`` | +--------+--------------+---------------------+---------------------+ | ``||`` | ``jsonb`` | 把两个 ``jsonb`` | ``'["a", | | | | 值串接成一个 | "b"]'::jsonb || '[ | | | | 新的\ ``jsonb``\ 值 | "c", "d"]'::jsonb`` | +--------+--------------+---------------------+---------------------+ | ``-`` | ``text`` | 从左操作数删除键 | ``'{"a": " | | | | /值对或者\ *string* | b"}'::jsonb - 'a'`` | | | | 元素。键/值对基于 | | | | | 它们的键值来匹配。 | | +--------+--------------+---------------------+---------------------+ | ``-`` | ``text[]`` | 从左 | ``'{"a": "b", | | | | 操作数中删除多个键 | "c": "d"}'::jsonb | | | | /值对或者\ *string* | - '{a,c}'::text[]`` | | | | \ 元素。键/值对基于 | | | | | 它们的键值来匹配。 | | +--------+--------------+---------------------+---------------------+ | ``-`` | ``integer`` | 删除具有指定 | ``'["a", | | | | 索引(负值表示倒数 | "b"]'::jsonb - 1`` | | | | )的数组元素。如果 | | | | | 顶层容器不是数 | | | | | 组则抛出一个错误。 | | +--------+--------------+---------------------+---------------------+ | ``#-`` | ``text[]`` | 删除具有指定路径 | ``'["a", {"b":1}]': | | | | 的域或者元素(对于 | :jsonb #- '{1,b}'`` | | | | JSON 数组,负值 | | | | | 表示倒数) | | +--------+--------------+---------------------+---------------------+ | ``@?`` | ``jsonpath`` | JSO | ``'{"a":[1,2,3 | | | | N路径是否返回指定的 | ,4,5]}'::jsonb @? ' | | | | JSON值的任何项目? | $.a[*] ? (@ > 2)'`` | +--------+--------------+---------------------+---------------------+ | ``@@`` | ``jsonpath`` | 返回指定的JSON路 | ``'{"a": | | | | 径谓词检查结果。只 | [1,2,3,4,5]}'::json | | | | 考虑结果的第一项。 | b @@ '$.a[*] > 2'`` | | | | 如果结果不 | | | | | 是布尔值,那么返回 | | | | | ``null`` 。 | | +--------+--------------+---------------------+---------------------+ .. note:: .. rubric:: 注意 :name: 注意-1 :class: title ``||``\ 操作符将其每一个操作数的顶层的元素串接起来。它不会递归 操作。例如,如果两个操作数都是具有公共域名称的对象,结果中的域值将 只是来自右手操作数的值。 .. note:: .. rubric:: 注意 :name: 注意-2 :class: title ``@?``\ 和\ ``@@@``\ 操作符会抑制以下错误:缺乏对象字段或数组元素、意外的JSON项类型和数字错误。当搜索不同结构的JSON文档集合时,这种行为可能会有帮助。 `表 JSON 创建函数 `__\ 展示了可用于创建 ``json`` 和 ``jsonb``\ 值的函数(没有用于 ``jsonb``\ 的与\ ``row_to_json``\ 和 ``array_to_json``\ 等价的函数。不过,\ ``to_jsonb``\ 函数 提供了这些函数的很大一部分相同的功能)。 .. container:: table :name: FUNCTIONS-JSON-CREATION-TABLE **JSON 创建函数** .. container:: table-contents +----------------+----------------+----------------+----------------+ | 函数 | 描述 | 例子 | 例子结果 | +================+================+================+================+ | ``to_json | 把该值返回为 | to_jso\ | ``"Fred s | | (anyelement)`` | \ ``json``\ 或 | n('Fred said " | aid \"Hi.\""`` | | | 者\ ``jsonb`` | Hi."'::text) | | | ``to_jsonb | \ 。数组和组合 | | | | (anyelement)`` | 会被 | | | | | (递归)转换成 | | | | | 数组和对象;对 | | | | | 于不是数组和组 | | | | | 合的值,如果有 | | | | | 从该类型到 | | | | | \ ``json``\ 的 | | | | | 造型,造型函数 | | | | | 将被用来执行该 | | | | | 转换 | | | | | ;否则将产生一 | | | | | 个标量值。对于 | | | | | 任何不是数字、 | | | | | 布尔、空值的标 | | | | | 量类型, | | | | | 将使用文本表达 | | | | | ,在这种风格下 | | | | | 它是一个合法的 | | | | | j\ | | | | | son 或者 | | | | | ``jsonb``\ 值。| | | +----------------+----------------+----------------+----------------+ | a\ | 把数组作为一个 | array\ | ``[[1, | | rray_to_json | JSON | _to_json( | 5],[99,100]]`` | | (anyarray [, p | 数组返回。一个 | '{{1,5},{99,10 | | | retty_bool]) | PostgreSQL | 0}}'::int[]) | | | | 多维数组 | | | | | 会成为一个数组 | | | | | 的 JSON | | | | | 数组。如果 | | | | | ``pretty_bool``| | | | | 为真,将在 | | | | | 第 1 | | | | | 维度的元素 | | | | | 之间增加换行。 | | | +----------------+----------------+----------------+----------------+ | row_to_js\ | 把行作为一个 | ``row_to_json | ``{"f1":1 | | on(record [, p | JSON | (row | ,"f2":"foo"}`` | | retty_bool]) | 对象返回。如果 | (1,'foo'))`` | | | | pretty_b\ | | | | | ool 为真, | | | | | 将在第1层元素 | | | | | 之间增加换行。 | | | +----------------+----------------+----------------+----------------+ | json_b\ | 从 | json\ | ``[1, 2 | | uild_array(VAR | 一个可变参数列 | _build_array( | , "3", 4, 5]`` | | IADIC "any") | 表构造一个可能 | 1,2,'3',4,5) | | | | 包含异质类型的 | | | | jsonb_b\ | JSON 数组。 | | | | uild_array(VAR | | | | | IADIC "any") | | | | +----------------+----------------+----------------+----------------+ | json_bu\ | 从一个可变参 | json_bui\ | ``{"foo": | | ild_object(VAR | 数列表构造一个 | ld_object('foo | 1, "bar": 2}`` | | IADIC "any") | JSON | ',1,'bar',2) | | | | 对象 | | | | jsonb_bu\ | 。通过转换,该 | | | | ild_object(VAR | 参数列表由交替 | | | | IADIC "any") | 出现 | | | | | 的键和值构成。 | | | +----------------+----------------+----------------+----------------+ | json_ob\ | 从一个文 | json\ | ``{"a": "1 | | ject(text[]) | 本数组构造一个 | _object(' | ", "b": "def", | | | JSON | {a, 1, b, "def | "c": "3.5"}`` | | jsonb_ob\ | 对象。该数 | ", c, 3.5}') | | | ject(text[]) | 组必须可以是具 | | | | | 有偶数个成员的 | jso\ | | | | 一维数组(成 | n_object('{{a, | | | | 员被当做交替出 | 1},{b, "def"} | | | | 现的键/值对) | ,{c, 3.5}}') | | | | ,或者是一个二 | | | | | 维数组(每一个 | | | | | 内部数组刚好有 | | | | | 2 | | | | | 个元 | | | | | 素,可以被看做 | | | | | 是键/值对)。 | | | +----------------+----------------+----------------+----------------+ | json\ | jso\ | json\ | ``{"a": "1 | | _object(k | n_object 的 | _object('{a, b | ", "b": "2"}`` | | eys text[], va | 这种形式从两个 | }', '{1,2}') | | | lues text[]) | 独立的数组得到 | | | | | 键/值对。在其 | | | | jsonb\ | 他方面和一个参 | | | | _object(k | 数的形式相同。 | | | | eys text[], va | | | | | lues text[]) | | | | +----------------+----------------+----------------+----------------+ .. note:: .. rubric:: 注意 :name: 注意-3 :class: title ``array_to_json``\ 和\ ``row_to_json``\ 与\ ``to_json`` 具有相同的行为,不过它们提供了更好的打印选项。针对\ ``to_json``\ 所描述 的行为同样也适用于由其他 JSON 创建函数转换的每个值。 .. note:: .. rubric:: 注意 :name: 注意-4 :class: title hstore 扩展有一个从\ ``hstore``\ 到\ ``json`` 的造型,因此通过 JSON 创建函数转换的\ ``hstore``\ 值将被表示为 JSON 对象,而不是原始字符串值。 `JSON 处理 `__\ 展示了可用来处理\ ``json`` 和\ ``jsonb``\ 值的函数。 .. container:: table :name: FUNCTIONS-JSON-PROCESSING-TABLE **JSON 处理** .. container:: table-contents +-------------+-------------+-------------+-------------+ | 函数 | 返回值 | 描述 | 例子 | +=============+=============+=============+=============+ | jso\ | int | 返回最外层\ | json_arr\ | | n_array_len\| | JSON\ | ay_length(' | | gth(json) | | 数组中的\ | [1,2,3,{"f1 | | | | 元素数量。 | ":1,"f2":[5 | | jsonb\ | | | ,6]},4]') | | _array_leng\| | | | | th(jsonb) | | | | +-------------+-------------+-------------+-------------+ | json_e\ | setof \ | 扩\ | select \ | | ach(json) | key text, v\| 展最外层的\ | * from json\| | | alue json | JSON\ | _each('{"a"\| | jsonb_ea\ | | 对象成为一\ | :"foo", "b"\| | ch(jsonb) | setof k\ | 组键/值对。 | :"bar"}') | | | ey text, va\| | | | | lue jsonb | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +-------------+-------------+-------------+-------------+ | json_each\ | setof \ | 扩\ | s\ | | _text\ | key text, v\| 展最外层的\ | elect * fro\| | (json) | alue text | JSON\ | m json_each\| | | | 对象成\ | _text('{"a"\| | js\ | | 为一组键/值\| :"foo", "b"\| | onb_each_te\| | 对。返回值\ | :"bar"}') | | xt(jsonb) | | 将是text\ | | | | | 类型。 | | | | | | | | | | | | | | | | | | | | | | | | | | | +-------------+-------------+-------------+-------------+ | json_ext\ | json | 返回由\ | jso\ | | ract_path(f\| | path_elems\ | n_extract_p\| | rom_json js\| jsonb | 指向的\ | ath('{"f2":\| | on, VARIADI\| | JSON\ | {"f3":1},"f\| | C path_elem\| | 值(等效\ | 4":{"f5":99\| | s text[]) | | 于\ #> \ | ,"f6":"foo"\| | | | 操作符)。 | }}','f4') | | | | | | | jsonb_extr\ | | | | | act_path(fr\| | | | | om_json jso\| | | | | nb, VARIADI\| | | | | C path_elem\| | | | | s text[]) | | | | +-------------+-------------+-------------+-------------+ | json\ | text | 以\ | jso\ | | _extract_p\ | | text\ | n_extract_p\| | ath_text(f\ | | 返回由\ | ath_text('{\| | rom_json js\| | path_elems\ | "f2":{"f3":\| | on, VARIADI\| | 指向的\ | 1},"f4":{"f\| | C path_elem\| | JSON\ | 5":99,"f6":\| | s text[]) | | 值(等效于\ | "foo"}}','f\| | | | \ #>> \ | 4', 'f6') | | json\ | | 操作符)。 | | | b_extract_p\| | | | | ath_text(fr\| | | | | om_json jso\| | | | | nb, VARIADI\| | | | | C path_elem\| | | | | s text[]) | | | | +-------------+-------------+-------------+-------------+ | js\ | s\ | 返回最外层\ | json_o\ | | on_object_k\| etof text | JSON\ | bject_keys\ | | eys(json) | | 对象中\ | ('{"f1":"ab\| | | | 的键集合。 | c","f2":{"f\| | json\ | | | 3":"a", "f4\| | b_object_ke\| | | ":"b"}}') | | ys(jsonb) | | | | | | | | | | | | | | | | | | | +-------------+-------------+-------------+-------------+ | json\ | a\ | 扩展\ | sele\ | | _popula\ | nyelement | from_json\ | ct * from j\| | te_record(b\| | 中的\ | son_populat\| | ase anyelem\| | 对象成一个\ | e_record(nu\| | ent, from_j\| | 行,它的列\ | ll::myrowty\| | son json) | | 匹配由\ | pe, '{"a":\ | | | | base 定\| 1, "b": ["2\| | js\ | | 义的记录类\ | ", "a b"],\ | | onb_populat\| | 型(见下文\ | "c": {"d":\ | | e_record(ba\| | 的注释)。 | 4, "e": "a\ | | se anyeleme\| | | b c"}}') | | nt, from_js\| | | | | on jsonb) | | | | +-------------+-------------+-------------+-------------+ | json\ | setof a\ | 扩展\ | s\ | | _populate_r\| nyelement | from_json | elect * fro\| | ecordset(b\ | | 中 | m json_popu\| | ase anyelem\| | 最外的对象 | late_record\| | ent, from_j\| | 数组为一个 | set(null::m\| | son json) | | 集合,该集 | yrowtype, '\| | | | 合的列匹配 | [{"a":1,"b"\| | jsonb\ | | 由 base | :2},{"a":3,\| | _populate_r\| | 定义的 | "b":4}]') | | ecordset(ba\| | 记录类型。 | | | se anyeleme\| | | | | nt, from_js\| | | | | on jsonb) | | | | +-------------+-------------+-------------+-------------+ | json_a\ | s\ | 把一个 JSON | sel\ | | rray_eleme\ | etof json | 数组 | ect * from\ | | nts(json) | | 扩展成一个 | json_array\ | | | se\ | JSON | _elements('\| | jsonb_a\ | tof jsonb | 值的集合。 | [1,true, [2\| | rray_elemen\| | | ,false]]') | | ts(jsonb) | | | | | | | | | | | | | | | | | | | | | | | | +-------------+-------------+-------------+-------------+ | json\ | s\ | 把一个 JSON | sel\ | | _array\ | etof text | 数 | ect * from | | _elements_t\| | 组扩展成一 | json_array\ | | ext(json) | | 个 text | _elements_t\| | | | 值集合。 | ext('["foo" | | jsonb\ | | | ,"bar"]') | | _array_e\ | | | | | lements_te\ | | | | | xt(jsonb) | | | | +-------------+-------------+-------------+-------------+ | json_typ\ | text | 把最外层的 | j\ | | eof(json) | | JSON | son_typeof(\| | | | 值的类 | '-123.4') | | j\ | | 型作为一个 | | | sonb_type | | 文本字符串 | | | of(jsonb) | | 返回。可能 | | | | | 的类型是: | | | | | objec | | | | | t 、 | | | | | array 、 | | | | | string 、 | | | | | number 、 | | | | | boolean | | | | | \ | | | | | 以及 | | | | | null 。 | | +-------------+-------------+-------------+-------------+ | | record | 从一个 JSON | s\ | | json_to_rec\| | 对 | elect * fro | | ord(json) | | 象(见下文 | m json_to_r | | | | 的注解)构 | ecord('{"a" | | js\ | | 建一个任意 | :1,"b":[1,2 | | onb_to_reco | | 的记录。正 | ,3],"c":[1, | | rd(jsonb) | | 如所有返回 | 2,3],"e":"b | | | | record | ar","r": {" | | | | 的 | a": 123, "b | | | | 函数一样, | ": "a b c"} | | | | 调用者必须 | }') as x(a | | | | 用一个 A | int, b text | | | | S 子句显 | , c int[], | | | | 式地定义记 | d text, r m | | | | 录的结构。 | yrowtype) | | | | | | | | | | | | | | | | +-------------+-------------+-------------+-------------+ | jso\ | set | 从一个 JSON | select * | | n_to_record\| of record | 对象数组( | from json_t\| | set(json) | | 见下文的注 | o_recordset | | | | 解)构建一 | ('[{"a":1," | | jsonb\ | | 个任意的记 | b":"foo"},{ | | _to_records\| | 录集合。正 | "a":"2","c" | | et(jsonb) | | 如所有返回 | :"bar"}]') | | | | record | as x(a int, | | | | 的 | b text); | | | | 函数一样, | | | | | 调用者必须 | | | | | 用一个 A | | | | | S 子句显 | | | | | 式地定义记 | | | | | 录的结构。 | | +-------------+-------------+-------------+-------------+ | j\ | json | 返回 fr\ | json_st\ | | son_strip_n\| | om_json | rip_nulls(' | | ulls(from_j\| jsonb | ,其中所有 | [{"f1":1,"f | | son json) | | 具有空值的 | 2":null},2, | | | | 对象域都被 | null,3]') | | jso\ | | 省略。其他 | | | nb_strip_nu\| | 空值不动。 | | | lls(from_js\| | | | | on jsonb) | | | | +-------------+-------------+-------------+-------------+ | jso\ | jsonb | 返回 | jsonb\ | | nb_set(targ\| | target | _set('[{"f1 | | et jsonb, p\| | ,其中由 | ":1,"f2":nu | | ath text[], | | path | ll},2,null, | | new_value | | 指定的节用 | 3]', '{0,f1 | | jsonb[,crea\| | ne | }','[2,3,4] | | te_missing | | w_value | ', false) | | boolean]) | | 替换,如果 | | | | | path | js\ | | | | 指定的项 | onb_set('[{ | | | | 不存在并且 | "f1":1,"f2" | | | | \ | :null},2]', | | | | create_mis\ | '{0,f3}',' | | | | sing 为 | [2,3,4]') | | | | 真(默认为 | | | | | true\ | | | | | )则加上 | | | | | \ | | | | | new_value | | | | | 。正如 | | | | | 面向路径的 | | | | | 操作 | | | | | 符一样,出 | | | | | 现在\ pa | | | | | th \ 中的 | | | | | 负 | | | | | 整数表示从 | | | | | JSON | | | | | 数组的末 | | | | | 尾开始数。 | | +-------------+-------------+-------------+-------------+ | sonb_i\ | jsonb | 返 | js\ | | nsert(targ | | 回被插入了 | onb_insert( | | et jsonb, p | | new_v\ | '{"a": [0,1 | | ath text[], | | alue 的 | ,2]}', '{a, | | new_value | | target | 1}', '"new\ | | jsonb [, in | | 。如果 | _value"') | | sert_after | | path | | | boolean]) | | 指定的\ | jsonb_in\ | | | | target | sert('{"a": | | | | 节在一个 | [0,1,2]}', | | | | JSONB | '{a, 1}', | | | | 数 | '"new_value | | | | 组中,\ | "', true) | | | | new_value | | | | | 将被插入 | | | | | 到目标之前 | | | | | ( ins | | | | | ert_after | | | | | 为 fa\| | | | | lse ,默 | | | | | 认情况)或 | | | | | 者之后( | | | | | insert_a\ | | | | | fter \ 为 | | | | | 真)。如果 | | | | | path | | | | | 指定的\ | | | | | target | | | | | 节在一个 | | | | | JSONB | | | | | 对象 | | | | | 内,则只有 | | | | | 当\ targ | | | | | et \ 不存 | | | | | 在时才插入 | | | | | new_v | | | | | alue 。 | | | | | 对于面向路 | | | | | 径的操作符 | | | | | 来说,出现 | | | | | 在\ path | | | | | \ 中的负 | | | | | 整数表示从 | | | | | JSON | | | | | 数组的末尾 | | | | | 开始计数。 | | +-------------+-------------+-------------+-------------+ | jsonb_pre\ | text | 把\ fr\ | jso\ | | tty(from_js | | om_json \ | nb_pretty(' | | on jsonb) | | 返回成一段 | [{"f1":1,"f | | | | 缩进后的 | 2":null},2, | | | | JSON 文本。 | null,3]') | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +-------------+-------------+-------------+-------------+ | js\ | boolean | 检查 | | | onb_path_ex | | JSON路径是 | jsonb_path | | ists(target | | 否为指定的 | _exists('{" | | jsonb, pat | | JSON值返回 | a":[1,2,3,4 | | h jsonpath | | 任何项目。 | ,5]}', '$.a | | [, vars jso | | | [*] ? (@ >= | | nb [, silen | | | $min && @\ | | t bool]]) | | | <= $max)', | | | | | '{"min":2," | | | | | max":4}') | +-------------+-------------+-------------+-------------+ | j\ | boolean | 返回指定的J | jsonb_p\ | | sonb_path_m | | SON路径谓词 | ath_match( | | atch(target | | 检查结果。 | '{"a":[1,2, | | jsonb, pat | | 只考虑结果 | 3,4,5]}', ' | | h jsonpath | | 的第一项。 | exists($.a[ | | [, vars jso | | 如果结果 | *] ? (@ >= | | nb [, silen | | 不是布尔值 | $min && @ < | | t bool]]) | | ,则返回\ ` | = $max))', | | | | `null \ 。 | '{"min":2," | | | | | max":4}') | +-------------+-------------+-------------+-------------+ | j\ | se\ | 获 | se\ | | sonb_path_q | tof jsonb | 取指定的JSO | lect * from | | uery(target | | N值的JSON路 | jsonb_path | | jsonb, pat | | 径返回的所 | _query('{"a | | h jsonpath | | 有JSON项。 | ":[1,2,3,4, | | [, vars jso | | | 5]}', '$.a[ | | nb [, silen | | | *] ? (@ >= | | t bool]]) | | | $min && @ < | | | | | = $max)', ' | | | | | {"min":2,"m | | | | | ax":4}'); | +-------------+-------------+-------------+-------------+ | jsonb_p\ | jsonb | 获取 | json\ | | ath_query_a | | 指定JSON路 | b_path_quer | | rray(target | | 径返回的所 | y_array('{" | | jsonb, path | | 有JSON项, | a":[1,2,3,4 | | jsonpath | | 并将结果封 | ,5]}', '$.a | | [, vars jso | | 装成数组。 | [*] ? (@ >= | | nb [, silen | | | $min && @ | | t bool]]) | | | <= $max)', | | | | | '{"min":2," | | | | | max":4}') | +-------------+-------------+-------------+-------------+ | jsonb_p\ | jsonb | 获取 | json\ | | ath_query_f | | 指定的JSON | b_path_quer | | irst(target | | 值的第一个J | y_first('{" | | jsonb, pat | | SON路径返回 | a":[1,2,3,4 | | h jsonpath | | 的JSON项。 | ,5]}', '$.a | | [, vars jso | | 如 | [*] ? (@ >= | | nb [, silen | | 果没有结果 | $min && @\ | | t bool]]) | | ,则返回\ | <= $max)', | | | | NULL \ 。 | '{"min":2," | | | | | max":4}') | +-------------+-------------+-------------+-------------+ .. note:: .. rubric:: 注意 :name: 注意-5 :class: title 很多这些函数和操作符将把 JSON 字符串中的 Unicode 转义转换成合适的单一字符。如果 输入类型是\ ``jsonb``\ ,这就没有问题,因为该转换已经完成了。但是对于\ ``json`` 输入,这可能会导致抛出一个错误。 .. note:: .. rubric:: 注意 :name: 注意-6 :class: title 函数 ``json[b]_populate_record``, ``json[b]_populate_recordset``, ``json[b]_to_record`` and ``json[b]_to_recordset`` 对JSON对象或对象数组进行操作,并提取与输出行类型的列名匹配的键相关的值。不对应于任何输出列名的对象字段将被忽略,不匹配任何对象字段的输出列将被填充为空。要将JSON值转换为输出列的SQL类型,需要依次应用以下规则: .. container:: itemizedlist - 在所有情况下,JSON空值都会被转换为SQL空值。 - 如果输出列的类型为\ ``json``\ 或\ ``jsonb``\ ,那么JSON值就会被完全复制。 - 如果输出的列是复合(行)类型,而JSON值是JSON对象,则通过递归应用这些规则,将该对象的字段转换为输出行类型的列。 - 同样,如果输出列是一个数组类型,而JSON值是一个JSON数组,则通过递归应用这些规则将JSON数组的元素转换为输出数组的元素。 - 否则,如果JSON值是一个字符串的字段,则该字符串的内容被送入列的数据类型的输入转换函数。 - 否则,将JSON值的普通文本表示方式送入该列的数据类型的输入转换函数。 虽然这些函数的例子使用了常量,但典型的用法是在\ ``FROM``\ 子句中引用一个表,并使用其中的\ ``json``\ 或\ ``jsonb``\ 列作为函数的参数。 然后,提取的键值可以被引用到查询的其他部分,比如\ ``WHERE``\ 子句和目标列表。 用这种方式提取多个值,比用每键操作符分别提取多个值可以提高性能。 .. note:: .. rubric:: 注意 :name: 注意-7 :class: title ``jsonb_set``\ 和\ ``jsonb_insert``\ 的\ ``path``\ 参数中除最后一项之外的所有项都必须存在于\ ``target``\ 中。如果\ ``create_missing``\ 为假,\ ``jsonb_set``\ 的\ ``path``\ 参数的所有项都必须存在。如果这些条件不满足,则返回的\ ``target``\ 不会被改变。 如果最后的路径项是一个对象键,在它不存在且给定了新值的情况下会创建它。如果最后的路径项是一个数组索引,为正值则表示从左边开始计数,为负值表示从右边开始计数 - ``-1``\ 表示最右边的元素,以此类推。如果该项超过范围 -array_length .. array_length -1 并且 create_missing 为真,则该项为负时把新值加载数组的开始处,而该项为正时把新值加在数组的末尾处。 .. note:: .. rubric:: 注意 :name: 注意-8 :class: title 不要把\ ``json_typeof``\ 函数的\ ``null``\ 返回值与 SQL 的 NULL 弄混。 虽然调用\ ``json_typeof('null'::json)``\ 将会返回\ ``null``\ ,但调用 ``json_typeof(NULL::json)``\ 将会返回一个 SQL 的 NULL。 .. note:: .. rubric:: 注意 :name: 注意-9 :class: title 如果\ ``json_strip_nulls``\ 的参数在任何对象中包含重复的域名称, 结果在语义上可能有所不同,具体取决于它们发生的顺序。这不是 ``jsonb_strip_nulls``\ 的一个问题,因为\ ``jsonb``\ 值 不能具有重复的对象域名称。 .. note:: .. rubric:: 注意 :name: 注意-10 :class: title ``jsonb_path_exists``\ 、\ ``jsonb_path_match``\ 、\ ``jsonb_path_query``\ 、\ ``jsonb_path_query_array``\ 。和 ``jsonb_path_query_first``\ 函数有可选的\ ``vars``\ 和\ ``silent``\ 参数。 如果指定了\ ``vars`` \ 参数,它提供了一个包含命名的变量的对象,要替换到\ ``jsonpath``\ 表达式中。 如果指定了\ ``silent`` \ 参数,并且具有\ ``true``\ 值,那么这些函数将抑制与\ ``@?``\ 和\ ``@@``\ 操作符相同的错误。 也可参见\ `聚集函数 `__\ 了解聚集函数\ ``json_agg``\ ,它可以把记录值聚集成 JSON。还有聚集函数\ ``json_object_agg``\ ,它可以把值对聚集成一个 JSON 对象。还有它们的\ ``jsonb``\ 等效体,\ ``jsonb_agg``\ 和\ ``jsonb_object_agg``. .. container:: sect2 :name: FUNCTIONS-SQLJSON-PATH .. container:: titlepage .. container:: .. container:: .. rubric:: SQL/JSON路径语言 :name: sqljson路径语言 :class: title SQL/JSON路径表达式指定了要从JSON数据中检索的项目,类似于SQL访问XML时使用的XPath表达式。在OushuDB中,路径表达式作为\ ``jsonpath``\ 数据类型实现,可以使用\ `JSON类型 `__\ 中描述的任何元素。 JSON查询函数和操作符将提供的路径表达式传递给\ *路径引擎*\ 进行评估。如果表达式与被查询的JSON数据匹配,则返回相应的SQL/JSON项。路径表达式是用SQL/JSON路径语言编写的,也可以包括算术表达式和函数。查询函数将提供的表达式视为文本字符串,所以必须用单引号括起来。 一个路径表达式由\ ``jsonpath``\ 数据类型允许的元素序列组成。路径表达式从左至右进行评估,但你可以使用括号来改变操作顺序。如果评价成功,则会产生一个SQL/JSON项的序列(\ *SQL/JSON序列*\ ),并将评价结果返回给完成指定计算的JSON查询函数。 要引用要查询的JSON数据(\ *context项*\ ),请在路径表达式中使用\ ``$``\ 符号。后面可以有一个或多个\ `accessor操作符 `__\ ,它可以逐级递减JSON结构中的上下文项的内容。下面的每一个操作符都涉及到上一个评估步骤的结果。 例如,假设你有一些来自GPS追踪器的JSON数据,你想对其进行解析,例如: .. code:: programlisting { "track": { "segments": [ { "location": [ 47.763, 13.4034 ], "start time": "2018-10-14 10:05:14", "HR": 73 }, { "location": [ 47.706, 13.2635 ], "start time": "2018-10-14 10:39:21", "HR": 135 } ] } } 要检索可用的轨迹段,需要使用\ ``.key``\ 访问器操作符来检索前面所有的JSON对象。 .. code:: programlisting '$.track.segments' 如果要检索的项目是一个数组的元素,你必须使用\ ``[*]``\ 操作符来取消这个数组的嵌套。例如,下面的路径将返回所有可用的轨道段的位置坐标。 .. code:: programlisting '$.track.segments[*].location' 要只返回第一段的坐标,可以在\ ``[]``\ 访问器操作符中指定相应的下标。请注意,SQL/JSON数组是0相关的: .. code:: programlisting '$.track.segments[0].location' 每个路径评估步骤的结果可以由一个或多个\ ``jsonpath``\ 操作符和\ `JSON函数 `__\ 中列出的方法处理。每个方法名称前必须有一个点。例如,你可以得到一个数组大小: .. code:: programlisting '$.track.segments.size()' 关于在路径表达式中使用\ ``jsonpath``\ 操作符和方法的更多示例,请参见 `JSON函数 `__. 在定义路径时,你还可以使用一个或多个\ *过滤表达式*\ ,其工作原理类似于SQL中的\ ``WHERE``\ 子句。一个过滤表达式以问号开头,并在括号中提供一个条件: .. code:: programlisting ? (condition) 筛选表达式必须在应用于路径评估步骤之后立即指定。这个步骤的结果被过滤,只包括那些满足所提供条件的项。SQL/JSON定义了三值逻辑,所以条件可以是\ ``true``\ 、\ ``false``\ 或\ ``unknown``\ 。\ ``unknown``\ 值的作用与SQL的\ ``NULL``\ 相同,可以用\ ``is unknown``\ 谓词来测试。进一步的路径评估步骤只使用那些过滤表达式返回\ ``true``\ 的项目。 在\ `JSON函数 `__\ 中列出了可以在过滤表达式中使用的函数和操作符。要过滤的路径评价结果由\ ``@``\ 变量表示。要引用存储在较低嵌套层的JSON元素,可以在\ ``@``\ 之后添加一个或多个访问符操作符。 假设你想检索所有心率值大于130的心率值。你可以用下面的表达式来实现: .. code:: programlisting '$.track.segments[*].HR ? (@ > 130)' 如果要得到带有这样的值的段的起始时间,需要在返回起始时间之前过滤掉不相关的段,所以过滤表达式应用于上一步,条件中使用的路径不同: .. code:: programlisting '$.track.segments[*] ? (@.HR > 130)."start time"' 如果需要,你可以在同一个嵌套层上使用多个过滤表达式。例如,下面的表达式选择所有包含有相关坐标和高心率值的位置的位置段,并选择了以下表达式: .. code:: programlisting '$.track.segments[*] ? (@.location[1] < 13.4) ? (@.HR > 130)."start time"' 也允许使用不同嵌套级别的过滤表达式。下面的例子首先按位置过滤所有的段,然后返回这些段的高心率值,如果可用的话: .. code:: programlisting '$.track.segments[*] ? (@.location[1] < 13.4).HR ? (@ > 130)' 你也可以在彼此之间嵌套过滤表达式: .. code:: programlisting '$.track ? (exists(@.segments[*] ? (@.HR > 130))).segments.size()' 该表达式返回轨道的大小,如果它包含任何具有高心跳值的片段,则返回轨道的大小,否则返回空序列。 PostgreSQL的SQL/JSON路径语言的实现与SQL/JSON标准有以下偏差。 .. container:: itemizedlist - ``.datetime()``\ 项方法还没有实现,这主要是因为不可变的\ ``jsonpath``\ 函数和操作符不能引用会话时区,而这是在一些日期时间操作中使用的。 在未来版本的PostgreSQL中,将在\ ``jsonpath``\ 中加入对Datetime的支持。 - 路径表达式可以是一个布尔谓词,尽管SQL/JSON标准只允许在过滤器中使用谓词。 这对于实现\ ``@@``\ 操作符是必要的。例如,下面的\ ``jsonpath``\ 表达式在PostgreSQL中有效。 .. code:: programlisting '$.track.segments[*].HR < 70' - `JSON函数 `__\ 中描述的\ ``like_regex``\ 过滤器中使用的正则表达式模式的解释有一些小的差异。 .. container:: sect3 :name: STRICT-AND-LAX-MODES .. container:: titlepage .. container:: .. container:: .. rubric:: 严格和宽松模式 :name: 严格和宽松模式 :class: title 当你查询JSON数据时,路径表达式可能与实际的JSON数据结构不匹配。试图访问一个对象或数组元素中不存在的成员,会导致结构错误。SQL/JSON路径表达式有两种模式来处理结构性错误。 .. container:: itemizedlist - lax (默认值) — 路径引擎隐式地将被查询的数据适应指定的路径。任何剩余的结构性错误都会被压制并转换为空的SQL/JSON序列。 - 严格的—如果发生结构性错误,则会提出错误。 宽松模式方便了JSON文档结构和路径的匹配。如果JSON数据不符合预期的模式,那么就会使用JSON表达式。如果一个操作项不符合特定操作的要求。 它可以被自动包装成一个SQL/JSON数组,或者通过 将其元素转换为SQL/JSON序列,然后再执行 这个操作。此外,比较操作者会自动解开他们的 运算子在宽松模式下,所以你可以比较SQL/JSON数组中的 开箱即用。一个大小为1的数组被认为等于它的唯一元素。自动解包并不是只有在以下情况下才会执行。 .. container:: itemizedlist - 路径表达式包含\ ``type()``\ 或\ ``size()``\ 方法,这些方法分别返回数组中的类型和元素数量。 - 被查询的JSON数据包含嵌套数组。在这种情况下,只有最外层的数组被解包,而所有内部数组保持不变。因此,在每个路径评估步骤中,隐式解包只能往下走一层。 例如,在查询上面列出的GPS数据时,可以抽象出它在使用宽松模式时存储了一个数组段的事实。 .. code:: programlisting 'lax $.track.segments.location' 在严格模式下,指定的路径必须与被查询的JSON文档的结构完全匹配才能返回一个SQL/JSON项,所以使用这个路径表达式会导致错误。为了得到与宽松模式下相同的结果,你必须显式地解包\ ``segments``\ 数组。 .. code:: programlisting 'strict $.track.segments[*].location' .. container:: sect3 :name: JSONPATH-REGULAR-EXPRESSIONS .. container:: titlepage .. container:: .. container:: .. rubric:: 正则表达式 :name: 正则表达式 :class: title SQL/JSON路径表达式允许用\ ``like_regex``\ 过滤器将文本匹配到正则表达式。 例如,下面的SQL/JSON路径查询将对数组中所有以英文元音开头的字符串进行大小写匹配。 .. code:: programlisting '$[*] ? (@ like_regex "^[aeiou]" flag "i")' 可选的\ ``flag``\ 字符串可以包括一个或多个字符\ ``i``\ ,用于不区分大小写的匹配,\ ``m``\ 允许\ ``^``\ 和\ ``$``\ 在换行处匹配,\ ``s``\ 允许\ ``.``\ 匹配一个新行,而\ ``q``\ 引用整个模式(将行为还原为简单的子串匹配)。 SQL/JSON标准借用了正则表达式的定义。\ ``LIKE_REGEX``\ 操作符,而该操作符又使用了 XQuery标准。 PostgreSQL目前不支持 ``LIKE_REGEX``\ 运算符。 因此。 ``like_regex`` 过滤器是用 POSIX正则表达式引擎在 `模式匹配 `__\ 。 这导致了各种小的 与标准SQL/JSON行为的差异,这些差异在 `模式匹配 `__\ 。但是,请注意,这里所描述的旗帜-字母不兼容的问题 不适用于SQL/JSON,因为它将XQuery标志字母转换为 匹配POSIX引擎的期望值。 请记住,\ ``like_regex``\ 的模式参数是一个JSON路径字符串字段,根据\ `JSON类型 `__\ 中给出的规则编写。 这特别意味着,你想在正则表达式中使用的任何反斜线必须是双倍的。例如,要匹配只包含数字的字符串。 .. code:: programlisting '$ ? (@ like_regex "^\\d+$")' .. container:: sect3 :name: FUNCTIONS-SQLJSON-PATH-OPERATORS .. container:: titlepage .. container:: .. container:: .. rubric:: SQL/JSON路径操作符和方法 :name: sqljson路径操作符和方法 :class: title `JSON函数 `__\ 显示了\ ``jsonpath``\ 中的操作符和方法。 `表  `__\ 显示了可用的过滤器表达式元素。 .. container:: table :name: FUNCTIONS-SQLJSON-OP-TABLE ** ``jsonpath`` 运算符和方法** .. container:: table-contents +-------------+-------------+-------------+-------------+-------------+ | 运 | 描述 | JSON举例 | Query举例 | 结果 | | 算符和方法 | | | | | +=============+=============+=============+=============+=============+ | ``+`` | 加号运 | ``{"x": | ``+ $. | ``2, | | (unary) | 算符,可对S | [2.85, -14. | x.floor()`` | -15, -10`` | | | QL/JSON序列 | 7, -9.4]}`` | | | | | 进行迭代。 | | | | +-------------+-------------+-------------+-------------+-------------+ | ``-`` | 对S | ``{"x": | ``- $. | ``- | | (unary) | QL/JSON序列 | [2.85, -14. | x.floor()`` | 2, 15, 10`` | | | 进行迭代的 | 7, -9.4]}`` | | | | | 减法运算器 | | | | +-------------+-------------+-------------+-------------+-------------+ | ``+`` | 加号 | ``[2]`` | ``2 | ``4`` | | (binary) | | | + $[0]`` | | +-------------+-------------+-------------+-------------+-------------+ | ``-`` | 减号 | ``[2]`` | ``4 | ``2`` | | (binary) | | | - $[0]`` | | +-------------+-------------+-------------+-------------+-------------+ | `` `` | 乘号 | ``[4]`` | | ``8`` | | | | | ``2 * $[0]``| | +-------------+-------------+-------------+-------------+-------------+ | ``/`` | 除号 | ``[8]`` | ``$[0] | ``4`` | | | | | / 2`` | | +-------------+-------------+-------------+-------------+-------------+ | ``%`` | 取模 | ``[32]`` | ``$[0] | ``2`` | | | | | % 10`` | | +-------------+-------------+-------------+-------------+-------------+ | ``type()`` | SQL/J | ``[1, | ``$[ | ``"number" | | | SON项的类型 | "2", {}]`` | *].type()`` | , "string", | | | | | | "object"`` | +-------------+-------------+-------------+-------------+-------------+ | ``size()`` | SQL/J | ``{"m": | ``$ | ``2`` | | | SON项的大小 | [11, 15]}`` | .m.size()`` | | +-------------+-------------+-------------+-------------+-------------+ | | 由 | ``{"len | ``$.len.dou | ``3.8`` | | ``double()``| SQL/JSON数 | ": "1.9"}`` | ble() * 2`` | | | | 字或字符串 | | | | | | 转换而来的 | | | | | | 近似浮点数 | | | | +-------------+-------------+-------------+-------------+-------------+ | | 大于或等于 | ``{ | ``$.h. | ``2`` | | ceiling() | SQL/JSON数 | "h": 1.3}`` | ceiling()`` | | | | 的最近整数 | | | | +-------------+-------------+-------------+-------------+-------------+ | ``floor()`` | 小于或等于 | ``{ | ``$. | ``1`` | | | SQL/JSON数 | "h": 1.3}`` | h.floor()`` | | | | 的最近整数 | | | | +-------------+-------------+-------------+-------------+-------------+ | ``abs()`` | SQL/JSO | ``{" | ``$\ | ``0.3`` | | | N号的绝对值 | z": -0.3}`` | .z.abs()`` | | +-------------+-------------+-------------+-------------+-------------+ | ``k | 对象的键 | ``{ | ``$.k | ``{"key": | | eyvalue()`` | -值对的序列 | "x": "20", | eyvalue()`` | "x", "value | | | ,用包含三 | "y": 32}`` | | ": "20", "i | | | 个字段的数 | | | d": 0}, {"k | | | 组来表示。 | | | ey": "y", " | | | (``"key"``, | | | value": 32, | | | | | | "id": 0}`` | | | ``"value"``,| | | | | | 和 | | | | | | ``"id"``). | | | | | | ``"id"`` | | | | | | 是键-值对所 | | | | | | 属对象的唯 | | | | | | 一标识符。 | | | | +-------------+-------------+-------------+-------------+-------------+ .. container:: table :name: FUNCTIONS-SQLJSON-FILTER-EX-TABLE **``jsonpath`` 筛选表达式元素** .. container:: table-contents +-------------+-------------+-------------+-------------+-------------+ | 值/谓语 | 描述 | JSON举例 | Query举例 | 结果 | +=============+=============+=============+=============+=============+ | ``==`` | 等号运算符 | ``[1, | ``$[*] ? | ``1, 1`` | | | | 2, 1, 3]`` | (@ == 1)`` | | +-------------+-------------+-------------+-------------+-------------+ | ``!=`` | 不 | ``[1, | ``$[*] ? | ``2, 3`` | | | 等号运算符 | 2, 1, 3]`` | (@ != 1)`` | | +-------------+-------------+-------------+-------------+-------------+ | ``<>`` | 不等号 | ``[1, | ``$[*] ? | ``2, 3`` | | | 运算符(same | 2, 1, 3]`` | (@ <> 1)`` | | | | as ``!=``) | | | | +-------------+-------------+-------------+-------------+-------------+ | ``<`` | 小于运算符 | ``[ | ``$[*] | ``1`` | | | | 1, 2, 3]`` | ? (@ < 2)`` | | +-------------+-------------+-------------+-------------+-------------+ | ``<=`` | 小于 | ``[ | ``$[*] ? | ``1, 2`` | | | 等于运算符 | 1, 2, 3]`` | (@ <= 2)`` | | +-------------+-------------+-------------+-------------+-------------+ | ``>`` | 大 | ``[ | ``$[*] | ``3`` | | | 于号运算符 | 1, 2, 3]`` | ? (@ > 2)`` | | +-------------+-------------+-------------+-------------+-------------+ | ``>=`` | 大于 | ``[ | ``$[*] ? | ``2, 3`` | | | 等于运算符 | 1, 2, 3]`` | (@ >= 2)`` | | +-------------+-------------+-------------+-------------+-------------+ | ``true`` | Value used | `` | ``$[*] | ``{" | | | to perform | [{"name": " | ? (@.parent | name": "Chr | | | comparison | John", "par | == true)`` | is", "paren | | | with JSON | ent": false | | t": true}`` | | | ``true`` | }, | | | | | literal | \ | | | | | | {"n | | | | | | ame": "Chri | | | | | | s", "parent | | | | | | ": true}]`` | | | +-------------+-------------+-------------+-------------+-------------+ | ``false`` | Value used | `` | ``$[*] ? | ``{" | | | to perform | [{"name": " | (@.parent | name": "Joh | | | comparison | John", "par | == false)`` | n", "parent | | | with JSON | ent": false | | ": false}`` | | | ``false`` | }, | | | | | literal | \ | | | | | | {"n | | | | | | ame": "Chri | | | | | | s", "parent | | | | | | ": true}]`` | | | +-------------+-------------+-------------+-------------+-------------+ | ``null`` | Value used | ``[{"name" | ``$[*] ? ( | ``"Mary"`` | | | to perform | : "Mary", " | @.job == nu | | | | comparison | job": null} | ll) .name`` | | | | with JSON | , | | | | | ``null`` | \ | | | | | value | {"name | | | | | | ": "Michael | | | | | | ", "job": " | | | | | | driver"}]`` | | | +-------------+-------------+-------------+-------------+-------------+ | ``&&`` | 布尔与 | ``[ | ``$[* | ``3`` | | | | 1, 3, 7]`` | ] ? (@ > 1 | | | | | | && @ < 5)`` | | +-------------+-------------+-------------+-------------+-------------+ | ``||`` | 布尔或 | ``[ | ``$[* | ``7`` | | | | 1, 3, 7]`` | ] ? (@ < 1 | | | | | | || @ > 5)`` | | +-------------+-------------+-------------+-------------+-------------+ | ``!`` | 布尔非 | ``[ | ``$[*] ? ( | ``7`` | | | | 1, 3, 7]`` | !(@ < 5))`` | | +-------------+-------------+-------------+-------------+-------------+ | l\ | 测试第 | ``["abc", " | ``$[*] ? ( | ``"ab | | ike_regex | 一个操作项 | abd", "aBdC | @ like_rege | c", "aBdC", | | | 是否与第二 | ", "abdacb" | x "^ab.*c" | "abdacb"`` | | | 个操作项给 | , "babc"]`` | flag "i")`` | | | | 出的正则表 | | | | | | 达式相匹配 | | | | | | ,可选择用 | | | | | | \ ``flag``\ | | | | | | 字符串描述 | | | | | | 的修改(见 | | | | | | `\ | | | | | | 节 `__\ )。 | | | | +-------------+-------------+-------------+-------------+-------------+ | st\ | 测试第 | ``[ | $[*] ? (@ | "Jo\ | | arts with | 二个执行项 | "John Smith | starts wit\ | hn Smith" | | | 是否是第一 | ", "Mary St | h "John") | | | | 个执行项的 | one", "Bob | | | | | 初始子串。 | Johnson"]`` | | | +-------------+-------------+-------------+-------------+-------------+ | ``exists`` | 测试 | ``{"x": | ``strict | ``2, 4`` | | | 一个路径表 | [1, 2], "y" | $.* ? (exis | | | | 达式是否至 | : [2, 4]}`` | ts (@ ? (@[ | | | | 少匹配一个S\| | *] > 2)))`` | | | | QL/JSON项。 | | | | +-------------+-------------+-------------+-------------+-------------+ | i\ | 测 | [-\ | ``$[*] ? | "\ | | s unknown | 试一个布尔 | 1, 2, 7, "i\| ((@ > 0) is | infinity" | | | 条件是否是 | nfinity"] | unknown)`` | | | | ``unknown`` | | | | +-------------+-------------+-------------+-------------+-------------+