You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL中查询JSON字段pushedToSnowflakePipeline='no'无结果的问题

问题描述

我有一张名为t_records的表,其中包含JSON类型的列col_json,该列的示例值如下:

{
  "1": {
    "value": null,
    "comment": null,
    "timestamp": null,
    "guidelineId": null,
    "pushedToSnowflakePipeline": "yes"
  },
  "2": {
    "value": null,
    "comment": null,
    "timestamp": null,
    "guidelineId": null,
    "pushedToSnowflakePipeline": "yes"
  },
  "3": {
    "value": null,
    "comment": null,
    "timestamp": null,
    "guidelineId": null,
    "pushedToSnowflakePipeline": "no"
  }
}

我想要查询其中存在pushedToSnowflakePipeline='no'的行,但使用以下查询语句未返回任何记录:

SELECT * 
FROM t_records 
WHERE JSON_EXTRACT(col_json, '$.*.pushedToSnowflakePipeline')='no';

请问我的查询语句哪里出错了?

错误原因

JSON_EXTRACT(col_json, '$.*.pushedToSnowflakePipeline')返回的是一个数组,示例数据会得到["yes", "yes", "no"]。直接将这个数组和字符串'no'做相等判断,逻辑上不成立,所以查不到结果。

正确查询方案

根据不同数据库,提供几种可行的写法:

1. MySQL环境

用JSON包含判断

SELECT * 
FROM t_records 
WHERE JSON_CONTAINS(JSON_EXTRACT(col_json, '$.*.pushedToSnowflakePipeline'), '"no"');

用JSON路径存在判断(MySQL 8.0+支持)

SELECT * 
FROM t_records 
WHERE JSON_PATH_EXISTS(col_json, '$.*?(@.pushedToSnowflakePipeline == "no")');

2. Snowflake环境

推荐用FLATTEN展开JSON对象后过滤,同时用DISTINCT避免重复返回原行:

SELECT DISTINCT t.*
FROM t_records t,
     LATERAL FLATTEN(input => t.col_json) f
WHERE f.value:pushedToSnowflakePipeline::STRING = 'no';

内容的提问来源于stack exchange,提问作者Pushpak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 18:15:23