DuckDb中JSON列数据提取:求类似Redshift的JSON_EXTRACT_PATH_TEXT()函数
DuckDB 替代 Redshift JSON_EXTRACT_PATH_TEXT() 的方案
在 DuckDB 里,你可以用以下几种方式提取 JSON 属性,效果和 Redshift 的 JSON_EXTRACT_PATH_TEXT() 一致:
1. 箭头运算符(最直观)
把 VARCHAR 转成 JSON 后,用 ->/->> 运算符提取:
->:返回 JSON 类型结果->>:直接返回 VARCHAR 类型结果(和 Redshift 函数返回字符串的行为更匹配)
示例:
假设你有表 user_data,列 json_str 是 VARCHAR 类型,内容为 '{"username": "jesse", "profile": {"email": "jesse@example.com", "age": 28}}'
- 提取顶层属性:
SELECT CAST(json_str AS JSON)->>'username' AS username FROM user_data;
结果会直接返回字符串 jesse
- 提取嵌套属性:
SELECT CAST(json_str AS JSON)->'profile'->>'email' AS email FROM user_data;
结果返回 jesse@example.com
2. json_extract_string 函数(与 Redshift 函数语法最接近)
DuckDB 的 json_extract_string() 函数和 Redshift 的 JSON_EXTRACT_PATH_TEXT() 用法几乎一致,直接传入 JSON 对象和属性路径即可:
- 提取顶层属性:
SELECT json_extract_string(CAST(json_str AS JSON), 'username') AS username FROM user_data;
- 提取嵌套属性(两种写法都支持):
-- 用点连接路径 SELECT json_extract_string(CAST(json_str AS JSON), 'profile.email') AS email FROM user_data; -- 按层级传入多个参数(和 Redshift 函数的多参数写法一致) SELECT json_extract_string(CAST(json_str AS JSON), 'profile', 'email') AS email FROM user_data;
如果你的 JSON 包含数组,还可以用索引提取元素,比如 json_extract_string(CAST(json_str AS JSON), 'hobbies[0]') 提取数组第一个元素。
内容的提问来源于stack exchange,提问作者Jesse McMullen-Crummey
相关产品推荐
相关产品推荐

