DuckDB 支持用于从现有 JSON 中读取值和创建新 JSON 数据的 SQL 函数。
JSON 支持通过 json
扩展实现,该扩展随大多数 DuckDB 发行版一起提供,并在首次使用时自动加载。
如果您想手动安装或加载它,请参阅 “安装和加载”页面。
关于 JSON
JSON 是一种开放标准的文件格式和数据交换格式,它使用人类可读的文本来存储和传输由属性-值对和数组(或其他可序列化的值)组成的数据对象。 虽然它不是表格数据的高效格式,但它非常常用,特别是作为数据交换格式。
最佳实践 DuckDB 实现了多种用于 JSON 提取的接口:JSONPath 和 JSON Pointer。它们都可以与箭头操作符 (
->
) 和json_extract
函数调用一起使用。最好选择一种语法并在整个应用程序中使用它。
索引
警告 遵循 PostgreSQL 的惯例,DuckDB 对其
ARRAY
和LIST
数据类型使用基于1的索引,但对 JSON 数据类型使用基于0的索引。
Examples
加载 JSON
从磁盘读取一个JSON文件,自动推断选项:
SELECT * FROM 'todos.json';
使用带有自定义选项的read_json
函数:
SELECT *
FROM read_json('todos.json',
format = 'array',
columns = {userId: 'UBIGINT',
id: 'UBIGINT',
title: 'VARCHAR',
completed: 'BOOLEAN'});
从标准输入读取一个JSON文件,自动推断选项:
cat data/json/todos.json | duckdb -c "SELECT * FROM read_json('/dev/stdin')"
将JSON文件读取到表中:
CREATE TABLE todos (userId UBIGINT, id UBIGINT, title VARCHAR, completed BOOLEAN);
COPY todos FROM 'todos.json';
或者,使用CREATE TABLE ... AS SELECT
子句创建表而不需要手动指定模式:
CREATE TABLE todos AS
SELECT * FROM 'todos.json';
Writing JSON
将查询结果写入JSON文件:
COPY (SELECT * FROM todos) TO 'todos.json';
JSON 数据类型
创建一个带有用于存储JSON数据的列的表,并将数据插入其中:
CREATE TABLE example (j JSON);
INSERT INTO example VALUES
('{ "family": "anatidae", "species": [ "duck", "goose", "swan", null ] }');
获取JSON数据
检索家族键的值:
SELECT j.family FROM example;
"anatidae"
使用JSONPath表达式提取家族键的值:
SELECT j->'$.family' FROM example;
"anatidae"
使用JSONPath表达式提取家族键的值作为VARCHAR
:
SELECT j->>'$.family' FROM example;
anatidae