sql >> Base de Datos >  >> RDS >> PostgreSQL

ERROR:el índice de la columna está fuera de rango:1, número de columnas:0

Tipos geométricos se puede ingresar de varias maneras.

  • En la primera forma, su ? los parámetros no se reemplazan con valores porque son partes literales de una cadena. Entonces se esperan 0 parámetros...

  • En la segunda forma sin comillas simples, su ? los parámetros se reemplazan, pero ((18.9750,72.8258), 5) se interpreta como un tipo de fila, que no funciona con circle() .

Está intentando invocar la función geométrica circle() que toma un point y una double precision ("centro y radio del círculo"). Estas son variantes de sintaxis válidas:

SELECT circle '((18.9750,72.8258), 5)'        AS cast_literal
     ' <(18.9750,72.82580),5>'::circle        AS cast_literal2
     , circle(point '(18.9750,72.8258)', '5') AS literal_point_n_radius
     , circle(point(18.9750,72.8258), '5')    AS point_n_literal_radius
     , circle(point(18.9750,72.8258), 5)      AS point_n_radius

violín SQL.
El elenco de ::text es solo para desinfectar la pantalla trastornada en SQL fiddle

En su caso, para proporcionar valores numéricos (no es una cadena literal), use la última forma y debería funcionar:

SELECT addressid, geocode
FROM   maddress
WHERE  geocode::point <@ circle(point(?,?), ?);

Si wso2dss (con el que no tengo experiencia) no acepta funciones, debe usar uno de los dos primeros formularios y proporcionar un único parámetro como cadena literal:

SELECT addressid, geocode
FROM   maddress
WHERE  geocode::point <@ circle ?;

... donde el parámetro es el literal concatenado como se muestra arriba.

podrías deje que Postgres haga la concatenación y aún pase tres valores numéricos:

SELECT addressid, geocode
FROM   maddress
WHERE  geocode::point <@ ('(('::text || ? || ',' || ? || '),' || ? || ')')::circle;