JSON 函数的类型
有两类用于解析 JSON 的函数:simpleJSON*(visitParam*),用于以极高速度解析受限的 JSON 子集。JSONExtract*,用于解析常规 JSON。
simpleJSON (visitParam) 函数
ClickHouse 提供了一组用于处理简化 JSON 的特殊函数。所有这些 JSON 函数都建立在对 JSON 形式的严格假设之上。它们会尽量少做处理,以便尽可能快地完成任务。 具体假设如下:- 字段名 (函数参数) 必须是常量。
- 字段名在 JSON 中必须采用某种规范编码形式。例如:
simpleJSONHas('{"abc":"def"}', 'abc') = 1,但simpleJSONHas('{"\\u0061\\u0062\\u0063":"def"}', 'abc') = 0 - 会在任意嵌套层级中搜索字段,不区分层级。如果存在多个匹配字段,则使用第一次出现的字段。
- JSON 在字符串字面量之外不能包含空格字符。
JSONExtract 函数
这些函数基于 simdjson 实现,适用于更复杂的 JSON 解析场景。不区分大小写的 JSONExtract 函数
这些函数在从 JSON 对象中提取值时执行 ASCII 不区分大小写的键名匹配。 它们的行为与对应的区分大小写版本完全一致,唯一的区别是匹配对象键名时不考虑大小写。 当多个仅大小写不同的键都能匹配时,将返回第一个匹配项。这些函数的性能可能不如对应的区分大小写版本,因此如无必要,建议使用常规的 JSONExtract 函数。
JSONPath 语法
JSON_EXISTS、JSON_VALUE 和 JSON_QUERY 函数的第二个参数接受 JSONPath
表达式。ClickHouse 实现了 JSONPath 的一个小型子集,
该子集大致基于 SQL/JSON 标准 (ISO/IEC TR 19075-6) ,且其支持范围有意比 RFC 9535
和其他常见实现更窄。支持的运算符如下。
权威实现位于
src/Functions/JSONPath/Parsers。
支持的运算符
注意:
- 可以在同一对方括号内组合使用索引和范围 (例如
[0 to 2, 4]) 。 - 不能在同一对方括号内组合使用索引范围和通配符 (例如,
[* , 0]无效) 。 - 在范围
[n to m]中,起始索引n必须严格小于结束索引m,否则会引发异常。 - 单个索引
[n]等同于范围[n to n+1]。
不支持的运算符
以下 JSONPath 运算符在 RFC 9535 或其他实现中可用,但 ClickHouse 不支持:JSONAllPaths
引入版本:v24.8.0 返回 JSON 列每一行中存储的所有路径列表。 语法json— JSON 列。JSON
Array(String)
示例
用法示例
Query
Response
JSONAllPathsWithTypes
引入版本:v24.8.0 返回 JSON 列中每一行存储的所有路径及其数据类型列表。 语法json— JSON 列。JSON
Map(String, String)
示例
使用示例
Query
Response
JSONAllValues
首次引入于:v26.4.0 以字符串数组的形式返回 JSON 列中每一行的所有值。 这些值会按其文本表示形式进行序列化,并按路径名称排序。 语法json— JSON 列。JSON
Array(String)
示例
用法示例
Query
Response
JSONArrayLength
引入版本:v23.2.0 返回最外层 JSON 数组中的元素数量。 如果输入的 JSON 字符串无效,该函数将返回NULL。
语法
JSON_ARRAY_LENGTH
参数
json— 有效 JSON 的 String。String
json 是有效的 JSON 数组 字符串,则返回数组元素个数;否则返回 NULL。Nullable(UInt64)
示例
使用示例
Query
Response
JSONDynamicPaths
引入版本:v24.8.0 返回以独立子列形式存储在 JSON 列中的动态路径列表。 语法json— JSON 列。JSON
Array(String)
示例
使用示例
Query
Response
JSONDynamicPathsWithTypes
引入版本:v24.8.0 返回 JSON 列中以独立子列形式存储的动态路径列表,以及它们在每一行中的类型。 语法json— JSON 列。JSON
Map(String, String)
示例
使用示例
Query
Response
JSONExtract
引入版本:v19.14.0 解析 JSON,并提取指定 ClickHouse 数据类型的值。 语法json— 要解析的 JSON 字符串。Stringindices_or_keys— 由零个或多个参数组成的列表,其中每个参数都可以是字符串或整数。String或(U)Int*return_type— 要返回的 ClickHouse 数据类型。String
Query
Response
JSONExtractArrayRaw
引入于:v20.1.0 返回一个数组,其中包含 JSON 数组 的各个元素,每个元素都表示为未解析字符串。 语法Array(String)
示例
用法示例
Query
Response
JSONExtractArrayRawCaseInsensitive
引入版本:v25.8.0 使用不区分大小写的键名匹配,返回一个 JSON 数组,其中每个元素都表示为未解析的字符串。此函数与JSONExtractArrayRaw 类似。
语法
Array(String)
示例
基本
Query
Response
JSONExtractBool
自 v20.1.0 起引入 解析 JSON 并提取 Bool 类型的值。 语法0。Bool
示例
用法示例
Query
Response
JSONExtractBoolCaseInsensitive
引入版本:v25.8.0 解析 JSON,并通过不区分大小写的键名匹配提取布尔值。该函数与JSONExtractBool 类似。
语法
true 为 1,false 为 0) ;如果未找到,则返回 0。UInt8
示例
基本用法
Query
Response
JSONExtractCaseInsensitive
引入版本:v25.8.0 解析 JSON,并通过不区分大小写的键名匹配提取指定 ClickHouse 数据类型的值。该函数类似于JSONExtract。
语法
json— 要解析的 JSON 字符串Stringindices_or_keys— 可选。用于定位到该字段的索引或键。键采用不区分大小写的匹配方式String或(U)Int*return_type— 要提取的 ClickHouse 数据类型String
Any
示例
int_type
Query
Response
Query
Response
JSONExtractFloat
引入版本:v20.1.0 解析 JSON 并提取 Float 类型的值。 语法0。Float64
示例
使用示例
Query
Response
JSONExtractFloatCaseInsensitive
引入版本:v25.8.0 解析 JSON,并通过不区分大小写的键名匹配提取 Float 类型的值。该函数与JSONExtractFloat 类似。
语法
Float64
示例
基本用法
Query
Response
JSONExtractInt
引入版本:v20.1.0 解析 JSON 并提取 Int 类型的值。 语法0。Int64
示例
用法示例
Query
Response
JSONExtractIntCaseInsensitive
引入版本:v25.8.0 解析 JSON,并通过不区分大小写的键名匹配提取 Int 类型的值。此函数与JSONExtractInt 类似。
语法
Int64
示例
基本用法
Query
Response
Query
Response
JSONExtractKeys
自 v21.11.0 引入 解析 JSON 字符串并提取键名。 语法Array(String)
示例
使用示例
Query
Response
JSONExtractKeysAndValues
引入版本:v20.1.0 从 JSON 中解析键值对,其中值的类型为指定的 ClickHouse 数据类型。 语法json— 要解析的 JSON 字符串。Stringindices_or_keys— 由零个或多个参数组成的列表,其中每个参数都可以是字符串或整数。String或(U)Int*value_type— 值的 ClickHouse 数据类型。String
Array(Tuple(String, value_type))
示例
用法示例
Query
Response
JSONExtractKeysAndValuesCaseInsensitive
引入版本:v25.8.0 通过不区分大小写的键名匹配从 JSON 中解析键值对。此函数与JSONExtractKeysAndValues 类似。
语法
json— 要解析的 JSON 字符串Stringindices_or_keys— 可选。用于定位到对象的索引或键。键按不区分大小写的方式匹配String或(U)Int*value_type— 值的 ClickHouse 数据类型String
Array(Tuple(String, T))
示例
基本用法
Query
Response
JSONExtractKeysAndValuesRaw
引入版本:v20.4.0 返回一个数组,其中包含 JSON 对象中的键和值组成的元组。所有值都以未解析的字符串形式表示。 语法Array(Tuple(String, String))
示例
用法示例
Query
Response
JSONExtractKeysAndValuesRawCaseInsensitive
引入版本:v25.8.0 使用不区分大小写的键名匹配,从 JSON 中提取原始键值对。此函数与JSONExtractKeysAndValuesRaw 类似。
语法
Array(Tuple(String, String))
示例
基本用法
Query
Response
JSONExtractKeysCaseInsensitive
引入版本:v25.8.0 解析 JSON 字符串,并通过不区分大小写的键名匹配访问嵌套对象并提取键。此函数类似于JSONExtractKeys。
语法
Array(String)
示例
基本用法
Query
Response
Query
Response
JSONExtractRaw
引入版本:v20.1.0 以未解析字符串的形式返回 JSON 的一部分。 语法String
示例
使用示例
Query
Response
JSONExtractRawCaseInsensitive
发布于:v25.8.0 使用不区分大小写的键名匹配,将 JSON 的一部分以未解析字符串的形式返回。此函数与JSONExtractRaw 类似。
语法
String
示例
object
Query
Response
JSONExtractString
引入版本:v20.1.0 解析 JSON 并提取 String 类型的值。 语法String
示例
使用示例
Query
Response
JSONExtractStringCaseInsensitive
引入版本:v25.8.0 解析 JSON,并通过不区分大小写的键名匹配提取字符串。此函数与JSONExtractString 类似。
语法
String
示例
基本用法
Query
Response
Query
Response
JSONExtractUInt
引入版本:v20.1.0 解析 JSON,并提取 UInt 类型的值。 语法0。UInt64
示例
用法示例
Query
Response
JSONExtractUIntCaseInsensitive
引入版本:v25.8.0 解析 JSON,并通过不区分大小写的键名匹配提取 UInt 类型的值。该函数与JSONExtractUInt 类似。
语法
UInt64
示例
基本用法
Query
Response
JSONHas
引入于版本:v20.1.0 检查 JSON 文档中是否存在给定的值。 语法json 中,则返回 1;否则返回 0 UInt8
示例
用法示例
Query
Response
JSONKey
引入版本:v20.1.0 返回 JSON 对象中指定索引 (从 1 开始) 处字段的键。如果 JSON 以字符串形式传入,则会先进行解析。第二个参数是用于访问嵌套对象的 JSON path。该函数返回指定位置的键名。 语法json— 要解析的 JSON 字符串。Stringindices_or_keys— 可选的索引或键列表,用于指定嵌套元素的路径。每个参数都可以是字符串 (通过键访问) 或整数 (通过从 1 开始的索引访问) 。String或Int*
String
示例
使用示例
Query
Response
JSONLength
引入版本:v20.1.0 返回 JSON 数组或 JSON 对象的长度。 如果该值不存在或类型不正确,则返回0。
语法
json— 要解析的 JSON 字符串String[, indices_or_keys, ...]— 可选。由零个或多个参数组成的列表。String或(U)Int8/16/32/64
0。UInt64
示例
使用示例
Query
Response
JSONMergePatch
引入版本:v23.10.0 返回通过合并多个 JSON 对象生成的合并后 JSON 对象字符串。 语法jsonMergePatch
参数
json1[, json2, ...]— 一个或多个有效的 JSON 字符串。String
String
示例
使用示例
Query
Response
JSONSharedDataPaths
引入版本:v24.8.0 返回存储在 JSON 列共享数据结构中的路径列表。 语法json— JSON 列。JSON
Array(String)
示例
用法示例
Query
Response
JSONSharedDataPathsWithTypes
引入版本:v24.8.0 返回 JSON 列中每一行存储在共享数据结构中的路径及其类型列表。 语法json— JSON 列。JSON
Map(String, String)
示例
使用示例
Query
Response
JSONType
引入版本:v20.1.0 返回 JSON 值的类型。如果该值不存在,则返回Null=0。
语法
json— 待解析的 JSON 字符串Stringjson[, indices_or_keys, ...]— 由零个或多个参数组成的列表,其中每个参数都可以是字符串或整数。String或(U)Int8/16/32/64
Null=0 枚举
示例
使用示例
Query
Response
JSON_EXISTS
引入版本:v21.8.0 如果该值存在于 JSON 文档中,则返回1。
如果该值不存在,则返回 0。
语法
1;否则返回 0。UInt8
示例
使用示例
Query
Response
JSON_QUERY
引入版本:v21.8.0 解析 JSON,并将某个值提取为 JSON 数组或 JSON 对象。 如果该值不存在,则返回空字符串。 语法String
示例
用法示例
Query
Response
JSON_VALUE
引入版本:v21.11.0 解析 JSON,并提取其中的一个值作为 JSON 标量。如果该值不存在,默认返回空字符串。 此函数的行为由以下设置控制:- 通过 SET
function_json_value_return_type_allow_nullable=true,将返回NULL。如果该值为复杂类型 (例如:struct、array、map) ,默认将返回空字符串。 - 通过 SET
function_json_value_return_type_allow_complex=true,将返回该复杂值。
String
示例
用法示例
Query
Response
dynamicElement
引入版本:v24.1.0 从Dynamic 列中提取指定类型的数据列。
此函数可从 Dynamic 列中提取特定类型的值。如果某一行包含所请求类型的值,
则返回该值。如果该行包含其他类型的值或 NULL,则对于标量类型返回 NULL,
对于数组类型返回空数组。
语法
dynamic— 要从中提取值的 Dynamic 列。Dynamictype_name— 要提取的 Variant 类型名称 (例如 ‘String’、‘Int64’、‘Array(Int64)’) 。
Any
示例
从 Dynamic 列提取不同类型
Query
Response
dynamicType
Introduced in: v24.1.0 返回Dynamic 列中每一行对应的 Variant 类型名称。
对于包含 NULL 的行,该函数返回 ‘None’。对于其他所有行,它返回存储在该行 Dynamic 列中的实际数据类型
(例如 ‘Int64’、‘String’、‘Array(Int64)’) 。
Syntax
dynamic— 要检查的 Dynamic 列。Dynamic
String
示例
检查 Dynamic 列中的类型
Query
Response
isDynamicElementInSharedData
引入版本:v24.1.0 对于存储为共享 Variant 格式而非单独子列的 Dynamic 列中的行,返回 true。 当 Dynamic 列设置了max_types 限制时,超出该限制的值会以共享二进制格式存储,
而不会拆分为各个独立的类型化子列。此函数可用于识别哪些行是以这种共享格式存储的。
语法
dynamic— 要检查的 Dynamic 列。Dynamic
Bool
示例
检查带有 max_types 限制的 Dynamic 列的存储格式
Query
Response
isValidJSON
自 v20.1.0 引入 检查传入的字符串是否为有效的 JSON。 语法json— 待验证的 JSON 字符串String
1;否则返回 0。UInt8
示例
用法示例
Query
Response
Query
Response
prettyPrintJSON
引入于:v26.4.0 返回经过美化格式化的 JSON 字符串,带有换行和空格缩进。 语法String
示例
简单对象
Query
Response
Query
Response
simpleJSONExtractBool
引入版本:v21.4.0 从名为field_name 的字段值中解析出一个 true/false 值。
结果为 UInt8。
语法
visitParamExtractBool
参数
json— 要在其中查找字段的 JSON。Stringfield_name— 要查找的字段名称。const String
true,则返回 1;否则返回 0。这意味着在以下情况 (包括但不限于) 下,此函数也会返回 0:
- 如果字段不存在。
- 如果字段包含字符串形式的
true,例如:{"field":"true"}。 - 如果字段包含数值
1。UInt8
Query
Response
simpleJSONExtractFloat
引入版本:v21.4.0 从名为field_name 的字段值中解析 Float64。
如果 field_name 是字符串字段,会尝试从字符串开头解析出数值。
如果该字段不存在,或虽存在但不包含数值,则返回 0。
语法
visitParamExtractFloat
参数
json— 要在其中查找字段的 JSON。Stringfield_name— 要查找的字段名称。const String
0。Float64
示例
用法示例
Query
Response
simpleJSONExtractInt
引入版本:v21.4.0 从名为field_name 的字段值中解析 Int64。
如果 field_name 是字符串字段,则会尝试从字符串开头解析数字。
如果该字段不存在,或者虽存在但不包含数字,则返回 0。
语法
visitParamExtractInt
参数
json— 用于查找字段的 JSON。Stringfield_name— 要查找的字段名称。const String
0。Int64
示例
使用示例
Query
Response
simpleJSONExtractRaw
引入版本:v21.4.0 返回名为field_name 的字段值,类型为 String,并保留分隔符。
语法
visitParamExtractRaw
参数
json— 要在其中查找字段的 JSON。Stringfield_name— 要查找的字段名称。const String
String
示例
用法示例
Query
Response
simpleJSONExtractString
引入版本:v21.4.0 从名为field_name 的字段的值中解析出双引号括起来的 String。
实现细节
目前不支持处理不属于基本多文种平面的 \uXXXX\uYYYY 格式码点 (它们会被转换为 CESU-8,而不是 UTF-8) 。
语法
visitParamExtractString
参数
json— 要在其中查找字段的 JSON。Stringfield_name— 要查找的字段名。const String
String
示例
使用示例
Query
Response
simpleJSONExtractUInt
引入版本:v21.4.0 从名为field_name 的字段值中解析 UInt64。
如果 field_name 是 String 类型的字段,则会尝试从字符串开头解析数值。
如果该字段不存在,或虽存在但不包含数值,则返回 0。
语法
visitParamExtractUInt
参数
json— 要搜索字段的 JSON。Stringfield_name— 要搜索的字段名。const String
0。UInt64
示例
用法示例
Query
Response
simpleJSONHas
引入版本:v21.4.0 检查是否存在名为field_name 的字段。
语法
visitParamHas
参数
json— 要在其中查找字段的 JSON。Stringfield_name— 要查找的字段名称。const String
1;否则返回 0。 UInt8
示例
使用示例
Query
Response
toJSONString
引入版本:v21.7.0 将一个值序列化为其 JSON 表示形式。支持多种数据类型和嵌套结构。 默认情况下,64 位整数或更大的整数 (例如UInt64 或 Int128) 输出时不带引号。output_format_json_quote_64bit_integers 控制此行为。
特殊值 NaN 和 inf 会被替换为 null。启用 output_format_json_quote_denormals 设置可显示它们。
序列化 枚举 值时,该函数会输出其名称。
另请参见:
语法
value— 要序列化的值。该值可以是任意数据类型。Any
String
示例
Map 的序列化
Query
Response
Query
Response