跳到主要内容
跳到主要内容

json-functions

有两组函数用于解析 JSON:

simpleJSON (visitParam) 函数

ClickHouse 提供了一些专用于简化 JSON 的特殊函数。所有这些 JSON 函数都是基于对 JSON 的强假设。它们尽量做最少的工作,以便尽快完成任务。

以下假设成立:

  1. 字段名称(函数参数)必须是常量。
  2. 字段名称在 JSON 中以某种方式是规范编码的。例如:simpleJSONHas('{"abc":"def"}', 'abc') = 1,但 simpleJSONHas('{"\\u0061\\u0062\\u0063":"def"}', 'abc') = 0
  3. 在任意嵌套级别上无差别地搜索字段。如果有多个匹配的字段,将使用第一个出现的字段。
  4. JSON 中字符串文字之外不应有空格字符。

simpleJSONHas

检查是否存在名为 field_name 的字段。结果为 UInt8

语法

别名:visitParamHas

参数

  • json — 要搜索字段的 JSON。 String
  • field_name — 要搜索的字段名称。 String literal

返回值

  • 如果字段存在则返回 1,否则返回 0UInt8

示例

查询:

结果:

simpleJSONExtractUInt

从名为 field_name 的字段值中解析 UInt64。如果这是一个字符串字段,它会尝试从字符串的开头解析一个数字。如果字段不存在,或者存在但不包含数字,则返回 0

语法

别名:visitParamExtractUInt

参数

  • json — 要搜索字段的 JSON。 String
  • field_name — 要搜索的字段名称。 String literal

返回值

  • 如果字段存在并且包含数字,则返回从字段中解析出的数字,反之返回 0UInt64

示例

查询:

结果:

simpleJSONExtractInt

从名为 field_name 的字段值中解析 Int64。如果这是一个字符串字段,它会尝试从字符串的开头解析一个数字。如果字段不存在,或者存在但不包含数字,则返回 0

语法

别名:visitParamExtractInt

参数

  • json — 要搜索字段的 JSON。 String
  • field_name — 要搜索的字段名称。 String literal

返回值

  • 如果字段存在并且包含数字,则返回从字段中解析出的数字,反之返回 0Int64

示例

查询:

结果:

simpleJSONExtractFloat

从名为 field_name 的字段值中解析 Float64。如果这是一个字符串字段,它会尝试从字符串的开头解析一个数字。如果字段不存在,或者存在但不包含数字,则返回 0

语法

别名:visitParamExtractFloat

参数

  • json — 要搜索字段的 JSON。 String
  • field_name — 要搜索的字段名称。 String literal

返回值

  • 如果字段存在并且包含数字,则返回从字段中解析出的数字,反之返回 0Float64.

示例

查询:

结果:

simpleJSONExtractBool

从名为 field_name 的字段值中解析一个 true/false 值。结果为 UInt8

语法

别名:visitParamExtractBool

参数

  • json — 要搜索字段的 JSON。 String
  • field_name — 要搜索的字段名称。 String literal

返回值

如果字段的值为 true,则返回 1,否则返回 0。这意味着该函数将返回 0 的情况包括(但不限于):

  • 如果字段不存在。
  • 如果字段以字符串形式包含 true,例如: {"field":"true"}
  • 如果字段以数字值 1 包含。

示例

查询:

结果:

simpleJSONExtractRaw

将名为 field_name 的字段的值作为 String 返回,包括分隔符。

语法

别名:visitParamExtractRaw

参数

  • json — 要搜索字段的 JSON。 String
  • field_name — 要搜索的字段名称。 String literal

返回值

  • 如果字段存在,则返回字段的值作为字符串(包括分隔符);否则返回空字符串。 String

示例

查询:

结果:

simpleJSONExtractString

从名为 field_name 的字段值中解析出带双引号的 String

语法

别名:visitParamExtractString

参数

  • json — 要搜索字段的 JSON。 String
  • field_name — 要搜索的字段名称。 String literal

返回值

  • 返回字段的未转义值作为字符串,包括分隔符。如果字段不包含双引号字符串、解除转义失败或字段不存在,则返回空字符串。 String

实施细节

目前不支持格式为 \uXXXX\uYYYY 的代码点,它们未从基本多语言平面(基本多语言平面)转换为 CESU-8 而不是 UTF-8。

示例

查询:

结果:

JSONExtract 函数

以下函数基于 simdjson 并设计用于更复杂的 JSON 解析需求。

isValidJSON

检查传入字符串是否为有效的 JSON。

语法

示例

JSONHas

如果值存在于 JSON 文档中,则返回 1。如果值不存在,则返回 0

语法

参数

  • json — 要解析的 JSON 字符串。 String
  • indices_or_keys — 一个参数列表,可以是零或多个参数,每个参数可以是字符串或整数。 StringInt*

indices_or_keys 类型:

  • 字符串 = 按键访问对象成员。
  • 正整数 = 从开头访问第 n 个成员/键。
  • 负整数 = 从末尾访问第 n 个成员/键。

返回值

  • 如果值存在于 json 中,返回 1,否则返回 0UInt8

示例

查询:

元素的最小索引为 1。因此,元素 0 不存在。您可以使用整数访问 JSON 数组和 JSON 对象。例如:

JSONLength

返回 JSON 数组或 JSON 对象的长度。如果值不存在或类型错误,则返回 0

语法

参数

  • json — 要解析的 JSON 字符串。 String
  • indices_or_keys — 一个参数列表,可以是零或多个参数,每个参数可以是字符串或整数。 StringInt*

indices_or_keys 类型:

  • 字符串 = 按键访问对象成员。
  • 正整数 = 从开头访问第 n 个成员/键。
  • 负整数 = 从末尾访问第 n 个成员/键。

返回值

  • 返回 JSON 数组或 JSON 对象的长度。如果值不存在或类型错误,则返回 0UInt64

示例

JSONType

返回 JSON 值的类型。如果值不存在,则返回 Null=0(不是通常的 Null,而是 Enum8('Null' = 0, 'String' = 34,...)。

语法

参数

  • json — 要解析的 JSON 字符串。 String
  • indices_or_keys — 一个参数列表,可以是零或多个参数,每个参数可以是字符串或整数。 StringInt*

indices_or_keys 类型:

  • 字符串 = 按键访问对象成员。
  • 正整数 = 从开头访问第 n 个成员/键。
  • 负整数 = 从末尾访问第 n 个成员/键。

返回值

  • 返回 JSON 值的类型作为字符串,如果值不存在则返回 Null=0Enum

示例

JSONExtractUInt

解析 JSON 并提取 UInt 类型的值。

语法

参数

  • json — 要解析的 JSON 字符串。 String
  • indices_or_keys — 一个参数列表,可以是零或多个参数,每个参数可以是字符串或整数。 StringInt*

indices_or_keys 类型:

  • 字符串 = 按键访问对象成员。
  • 正整数 = 从开头访问第 n 个成员/键。
  • 负整数 = 从末尾访问第 n 个成员/键。

返回值

  • 如果存在,则返回UInt值,否则返回 0UInt64

示例

查询:

结果:

JSONExtractInt

解析 JSON 并提取 Int 类型的值。

语法

参数

  • json — 要解析的 JSON 字符串。 String
  • indices_or_keys — 一个参数列表,可以是零或多个参数,每个参数可以是字符串或整数。 StringInt*

indices_or_keys 类型:

  • 字符串 = 按键访问对象成员。
  • 正整数 = 从开头访问第 n 个成员/键。
  • 负整数 = 从末尾访问第 n 个成员/键。

返回值

  • 如果存在,则返回Int值,否则返回 0Int64

示例

查询:

结果:

JSONExtractFloat

解析 JSON 并提取 Float 类型的值。

语法

参数

  • json — 要解析的 JSON 字符串。 String
  • indices_or_keys — 一个参数列表,可以是零或多个参数,每个参数可以是字符串或整数。 StringInt*

indices_or_keys 类型:

  • 字符串 = 按键访问对象成员。
  • 正整数 = 从开头访问第 n 个成员/键。
  • 负整数 = 从末尾访问第 n 个成员/键。

返回值

  • 如果存在,则返回 Float 值,否则返回 0Float64

示例

查询:

结果:

JSONExtractBool

解析 JSON 并提取布尔值。如果值不存在或类型错误,则返回 0

语法

参数

  • json — 要解析的 JSON 字符串。 String
  • indices_or_keys — 一个参数列表,可以是零或多个参数,每个参数可以是字符串或整数。 StringInt*

indices_or_keys 类型:

  • 字符串 = 按键访问对象成员。
  • 正整数 = 从开头访问第 n 个成员/键。
  • 负整数 = 从末尾访问第 n 个成员/键。

返回值

  • 如果存在,则返回布尔值,否则返回 0Bool

示例

查询:

结果:

JSONExtractString

解析 JSON 并提取字符串。该函数与 visitParamExtractString 函数类似。如果值不存在或类型错误,则返回空字符串。

语法

参数

  • json — 要解析的 JSON 字符串。 String
  • indices_or_keys — 一个参数列表,可以是零或多个参数,每个参数可以是字符串或整数。 StringInt*

indices_or_keys 类型:

  • 字符串 = 按键访问对象成员。
  • 正整数 = 从开头访问第 n 个成员/键。
  • 负整数 = 从末尾访问第 n 个成员/键。

返回值

  • 返回 JSON 中的未转义字符串。如果解除转义失败,值不存在或类型错误,则返回空字符串。 String

示例

JSONExtract

解析 JSON 并提取给定的 ClickHouse 数据类型的值。该函数是之前 JSONExtract<type> 函数的通用版本。意味着:

JSONExtract(..., 'String') 的返回值与 JSONExtractString() 完全相同, JSONExtract(..., 'Float64') 的返回值与 JSONExtractFloat() 完全相同。

语法

参数

  • json — 要解析的 JSON 字符串。 String
  • indices_or_keys — 一个参数列表,可以是零或多个参数,每个参数可以是字符串或整数。 StringInt*
  • return_type — 字符串,指定要提取的值的类型。 String

indices_or_keys 类型:

  • 字符串 = 按键访问对象成员。
  • 正整数 = 从开头访问第 n 个成员/键。
  • 负整数 = 从末尾访问第 n 个成员/键。

返回值

  • 返回存在的指定返回类型的值,否则返回 0Null 或空字符串,具体取决于指定的返回类型。 UInt64Int64Float64BoolString

示例

通过传递多个 indices_or_keys 参数引用嵌套值:

结果:

JSONExtractKeysAndValues

从 JSON 中解析键值对,其中值是给定的 ClickHouse 数据类型。

语法

参数

  • json — 要解析的 JSON 字符串。 String
  • indices_or_keys — 一个参数列表,可以是零或多个参数,每个参数可以是字符串或整数。 StringInt*
  • value_type — 字符串,指定要提取的值的类型。 String

indices_or_keys 类型:

  • 字符串 = 按键访问对象成员。
  • 正整数 = 从开头访问第 n 个成员/键。
  • 负整数 = 从末尾访问第 n 个成员/键。

返回值

  • 返回解析后的键值对数组。 Array(Tuple(value_type)).

示例

JSONExtractKeys

解析 JSON 字符串并提取键。

语法

参数

  • jsonString 中的有效 JSON。
  • a, b, c... — 逗号分隔的索引或键,指定嵌套 JSON 对象中内字段的路径。每个参数可以是字符串(通过键获取字段)或整数(获取第 N 个字段,索引从 1 开始,负整数从末尾计数)。如果未设置,则将整个 JSON 解析为顶级对象。可选参数。

返回值

示例

查询:

结果:

JSONExtractRaw

将 JSON 的一部分作为未解析的字符串返回。如果部分不存在或类型错误,则返回空字符串。

语法

参数

  • json — 要解析的 JSON 字符串。 String
  • indices_or_keys — 一个参数列表,可以是零或多个参数,每个参数可以是字符串或整数。 StringInt*

indices_or_keys 类型:

  • 字符串 = 按键访问对象成员。
  • 正整数 = 从开头访问第 n 个成员/键。
  • 负整数 = 从末尾访问第 n 个成员/键。

返回值

  • 将 JSON 的一部分作为未解析的字符串返回。如果部分不存在或类型错误,则返回空字符串。 String

示例

JSONExtractArrayRaw

返回包含 JSON 数组元素的数组,每个元素表示为未解析的字符串。如果部分不存在或不是数组,则返回空数组。

语法

参数

  • json — 要解析的 JSON 字符串。 String
  • indices_or_keys — 一个参数列表,可以是零或多个参数,每个参数可以是字符串或整数。 StringInt*

indices_or_keys 类型:

  • 字符串 = 按键访问对象成员。
  • 正整数 = 从开头访问第 n 个成员/键。
  • 负整数 = 从末尾访问第 n 个成员/键。

返回值

  • 返回包含 JSON 数组元素的数组,每个元素表示为未解析的字符串。如果不存在该部分或不是数组,则返回空数组。 Array(String)。

示例

JSONExtractKeysAndValuesRaw

从 JSON 对象中提取原始数据。

语法

参数

  • jsonString 中的有效 JSON。
  • p, a, t, h — 逗号分隔的索引或键,指定嵌套 JSON 对象中内字段的路径。每个参数可以是字符串(通过键获取字段)或整数(获取第 N 个字段,索引从 1 开始,负整数从末尾计数)。如果未设置,则将整个 JSON 解析为顶级对象。可选参数。

返回值

  • 包含 ('key', 'value') 元组的数组。两个元组成员都是字符串。 Array(Tuple(String, String))。
  • 如果请求的对象不存在或输入 JSON 无效,则返回空数组。 Array(Tuple(String, String))。

示例

查询:

结果:

查询:

结果:

查询:

结果:

JSON_EXISTS

如果值存在于 JSON 文档中,则返回 1。如果值不存在,则返回 0

语法

参数

  • json — 有效 JSON 的字符串。 String
  • path — 字符串,表示路径。 String
备注

在 21.11 版本之前,参数的顺序是错误的,即 JSON_EXISTS(path, json)

返回值

  • 如果值存在于 JSON 文档中,则返回 1,否则返回 0

示例

JSON_QUERY

解析 JSON 并将其值提取为 JSON 数组或 JSON 对象。如果值不存在,则返回空字符串。

语法

参数

  • json — 有效 JSON 的字符串。 String
  • path — 字符串,表示路径。 String
备注

在 21.11 版本之前,参数的顺序是错误的,即 JSON_EXISTS(path, json)

返回值

  • 返回提取的值作为 JSON 数组或 JSON 对象。如果值不存在,则返回空字符串。 String

示例

查询:

结果:

JSON_VALUE

解析 JSON 并提取一个 JSON 标量值。如果该值不存在,默认将返回一个空字符串。

此函数受以下设置控制:

  • 通过设置 function_json_value_return_type_allow_nullable = true,将返回 NULL。如果该值是复杂类型(例如:结构体、数组、映射),默认将返回一个空字符串。
  • 通过设置 function_json_value_return_type_allow_complex = true,将返回复杂值。

语法

参数

  • json — 一个包含有效 JSON 的字符串。 字符串
  • path — 表示路径的字符串。 字符串
备注

在版本 21.11 之前,参数的顺序是错误的,即 JSON_EXISTS(path, json)

返回值

  • 如果提取的值存在,则以 JSON 标量形式返回,否则将返回一个空字符串。 字符串

示例

查询:

结果:

toJSONString

将值序列化为其 JSON 表示。支持各种数据类型和嵌套结构。 64 位 整数 或更大的整数(如 UInt64Int128)默认用引号括起来。 output_format_json_quote_64bit_integers 控制此行为。 特殊值 NaNinf 被替换为 null。启用 output_format_json_quote_denormals 设置以显示它们。 序列化 枚举 值时,函数输出其名称。

语法

参数

  • value — 要序列化的值。值可以是任何数据类型。

返回值

示例

第一个示例显示 映射 的序列化。 第二个示例显示一些特殊值被包装在 元组 中。

查询:

结果:

另请参阅

JSONArrayLength

返回最外层 JSON 数组中的元素数量。如果输入的 JSON 字符串无效,函数返回 NULL。

语法

别名: JSON_ARRAY_LENGTH(json)

参数

返回值

  • 如果 json 是有效的 JSON 数组字符串,则返回数组元素的数量,否则返回 NULL。 Nullable(UInt64)

示例

jsonMergePatch

返回合并多个 JSON 对象形成的合并 JSON 对象字符串。

语法

参数

返回值

  • 如果 JSON 对象字符串有效,则返回合并后的 JSON 对象字符串。 字符串

示例

JSONAllPaths

返回存储在每个行中的 JSON 列的所有路径列表。

语法

参数

返回值

示例

JSONAllPathsWithTypes

返回存储在每个行中的 JSON 列的所有路径及其数据类型的映射。

语法

参数

返回值

示例

JSONDynamicPaths

返回存储为 JSON 列中单独子列的动态路径列表。

语法

参数

返回值

示例

JSONDynamicPathsWithTypes

返回存储为 JSON 列中单独子列的动态路径及其类型的映射。

语法

参数

返回值

示例

JSONSharedDataPaths

返回存储在共享数据结构中的路径列表,列在 JSON 列中。

语法

参数

返回值

示例

JSONSharedDataPathsWithTypes

返回存储在共享数据结构中的路径及其类型的映射,列在 JSON 列中。

语法

参数

返回值

示例