Більше

PostGIS: ST_Within повертає букви "t"/"f" замість "true"/"false" логічні значення

PostGIS: ST_Within повертає букви


У мене є простий запит, який містить, серед іншого:

SELECT ST_Within (ST_GeomFromText ('POINT (lon lat)', 4326), building.geom) AS is_within

Тому я очікую стовпець результатуis_withinбути булевим значенням. І ось що відбувається, коли я перевіряю це на QGIS. Потім я інтегрую його в деякий код Java, використовуючи відоме стандартне з'єднання з класом драйвера (нічого незвичайного):

Class.forName (DB_CLASS); З'єднання підключення = DriverManager.getConnection (DB_ADDRESS, DB_USER_NAME, DB_PASSWORD); if (connection! = null) {Оператор оператора = connection.createStatement (); Рядок SQL = ...; ResultSet resultSet = statement.executeQuery (SQL); while (resultSet.next ()) {System.out.println (resultSet.getString (1)); // результат - букви, а не логічні значення} resultSet.close (); statement.close (); connection.close (); }

Тепер з якихось причин результат "t" замість "true" і "f" замість "false". Чому це відбувається?


T/f проти true/false - це лише проблема відображення. Це внутрішньо логічне значення в PostgreSQL, але залежно від того, який драйвер ви використовуєте, логічне значення набуває різного представлення, при цьому t/f є стандартною канонічною формою для psql, pgAdmin та QGIS. У MSAccess стає -1.

У SQL ST_Within (…) = істина проти ST_Within = t проти ST_Within все означає одне і те ж.

Якщо ви зробите це, наприклад, у pgAdmin,

SELECT true;

ви отримуєте t

Але ви можете передати логічне значення тексту, а потім воно показує true/false

SELECT ST_Within ('LINESTRING (1 2, 3 4, 2 4)' :: geometry, 'POINT (3 4)' :: geometry) :: text;

Виходи:

помилковий

Чому SELECT t; не вважається логічним - для мене загадка :) Зараз розгублений :)


Якщо змінити рядок

System.out.println (resultSet.getString (1));

до

System.out.println (resultSet.getBoolean (1));

ви отримаєте замість рядка булеве значення.