PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

FEHLER:Der Spaltenindex liegt außerhalb des Bereichs:1, Anzahl der Spalten:0

Geometrische Typen kann auf mehrere Arten eingegeben werden.

  • Im ersten Formular Ihr ? Parameter werden nicht durch Werte ersetzt, da sie wörtliche Teile einer Zeichenfolge sind. Es werden also 0 Parameter erwartet ...

  • In der zweiten Form ohne einfache Anführungszeichen Ihr ? Parameter werden ersetzt, aber ((18.9750,72.8258), 5) wird als Zeilentyp interpretiert, was mit circle() nicht funktioniert .

Sie versuchen, die geometrische Funktion circle() das braucht einen Punkt und eine doppelte Genauigkeit ("Zentrum und Radius zum Kreis"). Dies sind gültige Syntaxvarianten:

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

SQL-Fiddle.
Die Umwandlung in ::text dient nur dazu, die gestörte Anzeige in SQL fiddle zu bereinigen

In Ihrem Fall, um numerische Werte bereitzustellen (kein String-Literal), verwenden Sie die letzte Form und es sollte funktionieren:

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

Wenn wso2dss (womit ich keine Erfahrung habe) keine Funktionen akzeptiert, müssen Sie eine der ersten beiden Formen verwenden und eine single angeben Parameter als String-Literal:

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

... wobei der Parameter das oben angezeigte verkettete Literal ist.

Sie könnten Postgres die Verkettung durchführen lassen und trotzdem drei numerische Werte übergeben:

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