PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

jak wykorzystać wartość kolumny jako dane wejściowe do operacji przestrzennej

Jeśli muszą być w jednym zapytaniu, wystarczy użyć wartości wyjściowych ST_X i ST_Y w ST_MakePoint funkcjonować. Jeśli wartości x i y są w kolumnach lub są wynikiem operacji, wystarczy przekazać te wartości w funkcji:

SELECT ST_MakePoint(column_x,column_y) FROM t;

Lub w przypadku, gdy są w geometrii.

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

Korzystanie z CTE lub podzapytanie (patrz komentarze). Zasada jest podobna, ale używając CTE tworzysz tymczasowy zestaw i używasz go jako tabeli. Poniższy przykład generuje wartości x i y i nazywa je j , następnie w zewnętrznym zapytaniu przechwytujesz te wartości, aby utworzyć punkt z innym SELECT , ale tym razem używając j :

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

Stosowanie go do zapytania ..

Demo (podzapytanie):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                  

Kilka przemyśleń na temat Twojego zapytania (bez możliwości zobaczenia pełnego obrazu):

  • ST_AsText zdecydowanie nie ma sensu w twoim pytaniu. Możesz się go pozbyć.
  • Zauważ, że kod, którego używasz do wyodrębnienia współrzędnych xiy, jest identyczny, a ST_DumpPoints już zwraca punkty. Uważam więc, że twoja logika jest błędna, ponieważ odtwarzasz ten sam punkt, który wcześniej podzieliłeś na oddzielne wartości.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kubernetes timescaledb statefulset:Zmiany utracone podczas odtwarzania pod

  2. jak uzyskać paginację wybierz na slick + postgresql

  3. Jak wykluczyć funkcje PL/pgSQL w eksporcie?

  4. Brak buforowania planu wykonania dla dynamicznego SQL w PostgreSQL 9.4?

  5. Dostrajanie wydajności:Utwórz indeks dla kolumny logicznej