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

hvordan man bruger værdien af ​​en kolonne som input til en rumlig operation

Hvis de skal være i en enkelt forespørgsel, skal du blot bruge outputværdierne for ST_X og ST_Y i ST_MakePoint fungere. Hvis x- og y-værdierne er i kolonner eller er resultatet af en operation, skal du blot sende disse værdier i funktionen:

SELECT ST_MakePoint(column_x,column_y) FROM t;

Eller hvis de er inden for geometrier...

SELECT ST_MakePoint(ST_X(a_geom),ST_Y(a_geom)) FROM t;

Brug af en CTE eller en underforespørgsel (Se kommentarer). Princippet er det samme, men ved at bruge en CTE opretter du ligesom et midlertidigt sæt og bruger det som en tabel. Følgende eksempel genererer x- og y-værdier og giver det navnet j , så fanger du disse værdier i den ydre forespørgsel for at oprette et punkt med en anden SELECT , men denne gang ved hjælp af j :

WITH j AS (
  SELECT 1 AS X, 2 AS y -- your big query goes here
) 
SELECT ST_MakePoint(X,Y) FROM j;

Anvender det på din forespørgsel ..

Demo (underforespørgsel):db<>fiddle

Demo (CTE):db<>fiddle

WITH j AS (
 SELECT 
    ST_X((ST_DumpPoints(ST_AsText(ST_Intersection(
        ST_SetSRID(
            ST_MakeEnvelope(
            ST_X(point),
            ST_Y(point),
            ST_X(point)+{width}, 
            ST_Y(point)+{height}),
            25832),ST_Buffer(j.geometry, {bufferRadius}) 
        )))).geom) AS XOfLowerLeftOfGridCellIntersectingWithBuffer,
        ST_Y((ST_DumpPoints(ST_AsText(ST_Intersection(
        ST_SetSRID(
            ST_MakeEnvelope(
            ST_X(point),
            ST_Y(point),
            ST_X(point)+{width}, 
            ST_Y(point)+{height}),
            25832),ST_Buffer(j.geometry, {bufferRadius}) 
        )))).geom) AS YOfLowerLeftOfGridCellIntersectingWithBuffer, 
    ....
)
SELECT ST_MakePoint(XOfLowerLeftOfGridCellIntersectingWithBuffer,
                    YOfLowerLeftOfGridCellIntersectingWithBuffer)
FROM j                  

Et par tanker om din forespørgsel (uden at kunne se det store billede):

  • ST_AsText giver bestemt ingen mening i din forespørgsel. Du kan slippe af med det.
  • Bemærk, at den kode, du bruger til at udtrække x- og y-koordinaterne, er identiske, og ST_DumpPoints giver allerede point. Så jeg mener, at din logik er mangelfuld, da du genskaber det samme punkt, som du tidligere delte op i adskilte værdier.



  1. Hurtigste måde at importere stor CSV-fil til MySql ved hjælp af MySql CLI

  2. Migrering af MySQL-database fra Amazon RDS til DigitalOcean

  3. Sådan erklærer du brugerdefineret undtagelse ved hjælp af en undtagelsesvariabel i Oracle-databasen

  4. Django:MySQL-syntaksfejl ved overførsel af parametre til rå SQL-forespørgsel