PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

ERRORE:l'indice della colonna non è compreso nell'intervallo:1, numero di colonne:0

Tipi geometrici può essere inserito in più modi.

  • Nella prima forma, il tuo ? i parametri non vengono sostituiti con valori perché sono parti letterali di una stringa. Quindi sono previsti 0 parametri ...

  • Nella seconda forma senza virgolette singole, il tuo ? i parametri vengono sostituiti, ma ((18.9750,72.8258), 5) viene interpretato come un tipo di riga, che non funziona con circle() .

Stai tentando di invocare la funzione geometrica circle() che prende un point e una double precision ("centro e raggio al cerchio"). Queste sono varianti di sintassi valide:

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

Fiddle SQL.
Il cast di ::text è solo per disinfettare il display squilibrato in SQL fiddle

Nel tuo caso, per fornire valori numerici (non una stringa letterale), usa l'ultimo modulo e dovrebbe funzionare:

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

Se wso2dss (con cui non ho esperienza) non accetta funzioni, devi utilizzare uno dei primi due moduli e fornire un singolo parametro come stringa letterale:

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

... dove il parametro è il letterale concatenato come mostrato sopra.

Potresti lascia che Postgres esegua la concatenazione e passi comunque tre valori numerici:

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