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

PostGIS查询用NOT ILIKE时出现匿名复合类型未实现错误求助

PostGIS查询报错:input of anonymous composite types is not implemented

问题详情

我有如下PostGIS查询:

with 
f as ( SELECT
    ST_AsGeoJSON(p.geompos)::json As geometry, 
    row_to_json((p.id_client, p.design_site, p.adresse)) As properties
    FROM sites p
    where p.id_client ilike '1%'

),  
fc as ( SELECT 
       'FeatureCollection' As type, 
       array_to_json(array_agg(f)) As features 
       FROM f 
      ) 
SELECT row_to_json(fc) FROM fc

该查询运行正常,但将条件改为:

where p.id_client not ilike '1%'

时,出现错误:

ERROR:  input of anonymous composite types is not implemented 
SQL state: 0A000

怀疑是部分几何数据导致问题,但数据量超过22000行,无法定位具体问题行。以下是sites表的DDL:

CREATE TABLE IF NOT EXISTS public.sites
(
    idsite serial,
    id_client character varying(8) COLLATE pg_catalog."default",
    design_site character varying(1024) COLLATE pg_catalog."default",
    adresse character varying(1024) COLLATE pg_catalog."default",
    geompos geometry,
    CONSTRAINT pk_sites PRIMARY KEY (idsite),
    CONSTRAINT fk_sites_associati_ref_clie FOREIGN KEY (id_client)
        REFERENCES public.ref_client (id_client) MATCH SIMPLE
        ON UPDATE RESTRICT
        ON DELETE RESTRICT
)

问题原因

这个错误和几何数据无关,核心问题出在匿名复合类型的JSON转换逻辑上:你用row_to_json((p.id_client, p.design_site, p.adresse))创建了一个没有字段名的匿名元组,当结果集中存在NULL值或特定数据类型时,PostgreSQL的row_to_json无法处理这种匿名复合类型的转换,而id_client ilike '1%'的结果集刚好没触发这个问题,not ilike '1%'的结果集里存在这类触发条件的数据。

解决方法

两种可行的修复方式,都是避免使用匿名元组,改用显式的JSON构造方式:

方法1:用子查询构造带字段名的行

with 
f as ( SELECT
    ST_AsGeoJSON(p.geompos)::json As geometry, 
    row_to_json(
        (SELECT x FROM (SELECT p.id_client, p.design_site, p.adresse) x)
    ) As properties
    FROM sites p
    where p.id_client not ilike '1%'

),  
fc as ( SELECT 
       'FeatureCollection' As type, 
       array_to_json(array_agg(f)) As features 
       FROM f 
      ) 
SELECT row_to_json(fc) FROM fc

方法2:用json_build_object直接构造JSON对象(更直观)

with 
f as ( SELECT
    ST_AsGeoJSON(p.geompos)::json As geometry, 
    json_build_object(
        'id_client', p.id_client,
        'design_site', p.design_site,
        'adresse', p.adresse
    ) As properties
    FROM sites p
    where p.id_client not ilike '1%'

),  
fc as ( SELECT 
       'FeatureCollection' As type, 
       array_to_json(array_agg(f)) As features 
       FROM f 
      ) 
SELECT row_to_json(fc) FROM fc

可选:验证几何数据(非必须)

如果还是担心几何数据有问题,可以执行以下查询排查:

-- 检查无效的几何对象
SELECT idsite, id_client, ST_IsValidReason(geompos)
FROM sites
WHERE id_client not ilike '1%' AND NOT ST_IsValid(geompos);

-- 检查空几何对象
SELECT idsite, id_client
FROM sites
WHERE id_client not ilike '1%' AND geompos IS NULL;

内容的提问来源于stack exchange,提问作者عبد القادر كعوان

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 10:53:20