PostgreSQL查询含多JSON元素的Symbol报错,求正确SQL写法
问题解决与正确SQL语句
报错原因分析
- 列名拼写错误:你编写的SQL里把目标列名
constituents误写为constitutents(缺少字母i),导致数据库无法定位正确列,进而误判处理对象为非数组类型。 - 数据类型不匹配:如果
constituents列存储的是普通文本(而非JSONB类型),直接调用jsonb_array_length函数会因无法识别文本为JSON数组而触发报错。
正确SQL语句
情况1:constituents列已定义为JSONB类型
修正列名拼写即可:
SELECT DISTINCT "Symbol" FROM "MyTable" WHERE JSONB_ARRAY_LENGTH("constituents") > 1;
情况2:constituents列是文本类型(如VARCHAR)
需要先将文本转换为JSONB类型再计算数组长度:
SELECT DISTINCT "Symbol" FROM "MyTable" WHERE JSONB_ARRAY_LENGTH("constituents"::JSONB) > 1;
补充:兼容非法JSON数据的写法
如果表中存在部分行的constituents值不是合法JSON数组,可先过滤合法数据避免报错:
SELECT DISTINCT "Symbol" FROM "MyTable" WHERE "constituents" ~ '^\[.*\]$' AND JSONB_ARRAY_LENGTH("constituents"::JSONB) > 1;
内容的提问来源于stack exchange,提问作者MathMan 99
相关产品推荐
相关产品推荐

