Snowflake中含空格的JSON字段查询失败问题求助
解决Snowflake中JSON字段日期比较的查询问题
你的问题核心在于JSON字段提取出的默认是VARIANT类型,直接与日期字符串比较会存在类型不匹配或隐式转换失效的情况,以下是针对性的解决步骤:
1. 显式转换JSON字段为TIMESTAMP类型
Snowflake不会自动将JSON中的日期字符串转换为TIMESTAMP类型,需手动指定转换逻辑,确保类型一致后再进行比较:
SELECT distinct "Book Name." from TEST.RAW.VIEW_BOOK WHERE TO_TIMESTAMP(PAYLOAD_JSON:"Created on") >= '2023-10-27T21:33:02' OR TO_TIMESTAMP(PAYLOAD_JSON:"Finally accepted") >= '2023-10-27T21:33:02';
如果JSON内的日期格式与Snowflake默认TIMESTAMP格式不匹配,需补充格式参数:
TO_TIMESTAMP(PAYLOAD_JSON:"Created on", 'YYYY-MM-DD"T"HH24:MI:SS')
2. 验证JSON键名的准确性
确认JSON中的键名与查询语句完全一致(包括大小写、空格、特殊字符),可先运行以下查询验证键是否存在:
SELECT PAYLOAD_JSON:"Created on", PAYLOAD_JSON:"Finally accepted" FROM TEST.RAW.VIEW_BOOK LIMIT 10;
若返回NULL,说明键名不匹配,需修正为JSON实际的键名。
3. 换用GET_PATH函数处理特殊键名
当键名包含空格等特殊字符时,冒号语法可能出现兼容问题,可尝试使用GET_PATH函数替代:
SELECT distinct "Book Name." from TEST.RAW.VIEW_BOOK WHERE TO_TIMESTAMP(GET_PATH(PAYLOAD_JSON, 'Created on')) >= '2023-10-27T21:33:02' OR TO_TIMESTAMP(GET_PATH(PAYLOAD_JSON, 'Finally accepted')) >= '2023-10-27T21:33:02';
4. 处理NULL值避免逻辑异常
若JSON中存在缺失目标键的情况,转换后会得到NULL,NULL与任何值比较都返回UNKNOWN,可添加NULL判断优化逻辑:
SELECT distinct "Book Name." from TEST.RAW.VIEW_BOOK WHERE (PAYLOAD_JSON:"Created on" IS NOT NULL AND TO_TIMESTAMP(PAYLOAD_JSON:"Created on") >= '2023-10-27T21:33:02') OR (PAYLOAD_JSON:"Finally accepted" IS NOT NULL AND TO_TIMESTAMP(PAYLOAD_JSON:"Finally accepted") >= '2023-10-27T21:33:02');
内容的提问来源于stack exchange,提问作者Lilly
相关产品推荐
相关产品推荐

