PostgreSQL jsonb_path_query_first_tz() 函数使用指南

PostgreSQL jsonb_path_query_first_tz() 函数在一个给定的 JSON 中根据指定的路径获取值,并返回第一个匹配的值。此函数与 jsonb_path_query_first() 的不同之处在于提供了对带有时区的日期/时间的支持。

jsonb_path_query_first_tz() 语法

这是 PostgreSQL jsonb_path_query_first_tz() 函数的语法:

jsonb_path_query_first_tz(
    target JSONB
  , path JSONPATH
  [, vars JSONB
  [, silent BOOLEAN]]
) -> JSONB

参数

target
必需的。 要检查的 JSONB 值。
path
必需的。 要检查的 JSON 路径,它是 JSONPATH 类型的。
vars
可选的。 路径中要用到的变量值。
silent
可选的。 如果提供了此参数,并且为 true,该函数会像 @?@@ 操作符一样抑制相同的错误。

返回值

PostgreSQL jsonb_path_query_first_tz() 函数返回一个 JSON 值,它是在指定的 JSON 值中第一个与指定的路径匹配的值。

如果任意一个参数是 NULL,jsonb_path_query_first_tz() 函数将返回 NULL。

jsonb_path_query_first_tz() 示例

JSON 数组

下面的示例展示了如何使用 PostgreSQL jsonb_path_query_first_tz() 函数从一个 JSON 数组中获取第一个与指定的路径匹配的值。

SELECT jsonb_path_query_first_tz('[1, 2, 3]', '$[*] ? (@ > 1)');
 jsonb_path_query_first_tz
---------------------------
 2

我们可以在 JSON 路径中使用变量,如下:

SELECT jsonb_path_query_first_tz(
    '[1, 2, 3, 4]',
    '$[*] ? (@ >= $min && @ <= $max)',
    '{"min": 2, "max": 3}'
);
 jsonb_path_query_first_tz
---------------------------
 2

这里,我们在 JSON 路径 $[*] ? (@ >= $min && @ <= $max) 中使用了两个变量 minmax,并且我们在参数 var 中为变量提供了值 {"min": 2, "max": 3},这样,JSON 路径变成了 $[*] ? (@ >= 2 && @ <= 3)

JSON 对象

下面的示例展示了如何使用 PostgreSQL jsonb_path_query_first_tz() 函数从一个 JSON 对象中根据指定的路径获取第一个匹配的值。

SELECT jsonb_path_query_first_tz(
    '{"x": 1, "y": 2, "z": 3}',
    '$.* ? (@ >= 2)'
);
 jsonb_path_query_first_tz
---------------------------
 2

这里, JSON 路径 $.* ? (@ >= 2) 表示在 JSON 对象 {"x": 1, "y": 2, "z": 3} 中的顶层成员的值中大于 2 的值。

时区

PostgreSQL jsonb_path_query_first_tz() 函数支持带时区的时间戳。如下:

select
    jsonb_path_query_first_tz(
        '["2015-08-01 12:00:00 +00"]',
        '$[*] ? (@.datetime() < "2015-08-02".datetime())'
    );
 jsonb_path_query_first_tz
---------------------------
 "2015-08-01 12:00:00 +00"