ST_Within
Definition
ST_Within returns 1 (Oracle) or t (PostgreSQL) if the first ST_Geometry object is completely inside the second; otherwise, it returns 0 (Oracle) or f (PostgreSQL).
Syntax
sde.st_within (g1 sde.st_geometry, g2 sde.st_geometry)
Return type
Boolean
Example
In the example below, two tables are created: one, bfootprints, contains a city's building footprints, while the other, lots, contains its lots. The city engineer wants to make sure that all the building footprints are completely inside their lots.
In both tables, the multipolygon data type stores the ST_Geometry of the building footprints and lots. The database designer selected ST_MultiPolygons for both features because she realized a lot can be separated by a natural feature, such as a river, and a building footprint can be made up of several buildings.
CREATE TABLE bfootprints (building_id integer,
footprint sde.st_geometry);
CREATE TABLE lots (lot_id integer,
lot sde.st_geometry);
INSERT INTO bfootprints (building_id, footprint) VALUES (
1,
sde.st_polygon ('polygon ((0 0, 0 10, 10 10, 10 0, 0 0))', 0)
);
INSERT INTO bfootprints (building_id, footprint) VALUES (
2,
sde.st_polygon ('polygon ((20 0, 20 10, 30 10, 30 0, 20 0))', 0)
);
INSERT INTO bfootprints (building_id, footprint) VALUES (
3,
sde.st_polygon ('polygon ((40 0, 40 10, 50 10, 50 0, 40 0))', 0)
);
INSERT INTO lots (lot_id, lot) VALUES (
1,
sde.st_polygon ('polygon ((-1 -1, -1 11, 11 11, 11 -1, -1 -1))', 0)
);
INSERT INTO lots (lot_id, lot) VALUES (
2,
sde.st_polygon ('polygon ((19 -1, 19 11, 29 9, 31 -1, 19 -1))', 0)
);
INSERT INTO lots (lot_id, lot) VALUES (3,
sde.st_polygon ('polygon ((39 -1, 39 11, 51 11, 51 -1, 39 -1))', 0)
);
The city engineer selects the buildings that are not completely within a lot.
Oracle
SELECT bf.building_id
FROM BFOOTPRINTS bf, LOTS l
WHERE sde.st_intersects (bf.footprint, l.lot) = 1
AND sde.st_within (bf.footprint, l.lot) = 0;
BUILDING_ID
2
PostgreSQL
SELECT bf.building_id
FROM bfootprints bf, lots l
WHERE sde.st_intersects (bf.footprint, l.lot) = 't'
AND sde.st_within (bf.footprint, l.lot) = 'f';
building_id
2