如何在SQL查询的WHERE子句中过滤JSON列的ProductName属性?
在SQL的WHERE条件中过滤JSON列里的数组对象属性(ProductName)
针对不同主流数据库,提供对应的实现方案:
MySQL(8.0+)
方法1:用JSON_TABLE展开数组行进行匹配
适合需要精准匹配或复杂条件过滤的场景,通过将JSON数组转成临时表行来关联查询:
SELECT * FROM your_table WHERE EXISTS ( SELECT 1 FROM JSON_TABLE( your_table.data->'$.Product', '$[*]' COLUMNS ( ProductName VARCHAR(255) PATH '$.ProductName' ) ) AS products WHERE products.ProductName = 'TestName' );
方法2:用JSON_SEARCH快速判断存在性
如果只是检查是否存在指定ProductName,用这个更简洁:
SELECT * FROM your_table WHERE JSON_SEARCH(data->'$.Product[*].ProductName', 'one', 'TestName') IS NOT NULL;
JSON_SEARCH会返回匹配值的JSON路径,不为空即说明存在目标ProductName。
PostgreSQL
方法1:展开数组行匹配(兼容json/jsonb类型)
SELECT * FROM your_table t WHERE EXISTS ( SELECT 1 FROM json_array_elements(t.data->'Product') AS prod WHERE (prod->>'ProductName') = 'TestName' );
如果是jsonb类型,也可以用更高效的包含操作符:
SELECT * FROM your_table WHERE data @> '{"Product": [{"ProductName": "TestName"}]}';
SQL Server
用OPENJSON将JSON数组转成关系表行,再进行条件过滤:
SELECT * FROM your_table t WHERE EXISTS ( SELECT 1 FROM OPENJSON(t.data, '$.Product') WITH ( ProductName VARCHAR(255) '$.ProductName' ) AS prod WHERE prod.ProductName = 'TestName' );
额外注意事项
- 如果数据库支持,优先使用
jsonb(PostgreSQL)或优化过的JSON类型,比原生json类型查询性能更高。 - 若需要模糊匹配,把等于条件换成
LIKE即可,比如products.ProductName LIKE '%Test%'。 - 替换示例中的
your_table为你实际的数据表名。
内容的提问来源于stack exchange,提问作者Manikandan
相关产品推荐
相关产品推荐

