在PostgreSQL中返回布尔类型

时间:2018-02-11 16:53:52

标签: php sql postgresql

我正在使用ST_Intersects()来了解两个几何是否相交。 这是我的代码:

$var_name = pg_query($conn,"SELECT ST_Intersects(p1.column_name, 
p2.column_name)
FROM table_name AS p1, table_name AS p2
WHERE p1.id < p2.id");
if(pg_fetch_assoc($var_name) == 'false')
{
echo "accepted";
}
else
{
echo "rejected";
}

我知道几何不相交,当我在Postgres中运行相同的查询时,结果是false正如预期的那样。

但是这里正在执行else语句。我哪里错了?

2 个答案:

答案 0 :(得分:1)

Erwin的建议(一如既往)很好,但在您的特定情况下,我认为问题出在您的测试中。

if(pg_fetch_assoc($var_name) == 'false')

pg_fetch_assoc返回一个与单个字符串进行比较的关联数组。比较混合类型在php中是一个复杂的过程,但在这种情况下,它知道字符串不是数组,所以它们不相等。

您可能需要以下内容:

$row = pg_fetch_assoc($var_name) if ($row['ST_Intersects'] == false)

不要猜测,做print_r($row)之类的事情来确认你有你认为的列名和值。

答案 1 :(得分:0)

每次调用它时,相同的查询都会返回不同的结果,因为它不具有确定性。任何数量的行都可以在每个表中限定,从而生成结果的笛卡尔积。由于查询中没有明确的ORDER BY,因此将首先返回任意行。

添加ORDER BY(加LIMIT 1)个或更多WHERE条件以返回单行(确定性地)。

替代查询:

SELECT EXISTS (
   SELECT 1
   FROM   table_name p1
   JOIN   table_name p2 ON p1.id < p2.id
   WHERE  ST_Intersects(p1.column_name, p2.column_name)
   );

这将返回1行truefalse(从不null,从不返回0或多行)。如果至少有一个组合相交,则为true

但是也可以在Richard's answer中查看测试的PHP部分。