【问题标题】:Return boolean type in PostgreSQL在 PostgreSQL 中返回布尔类型
【发布时间】:2018-02-11 16:53:52
【问题描述】:

我正在使用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 语句。我哪里错了?

【问题讨论】:

  • 除其他外,我敢打赌 Postgres 返回布尔值 false,而不是字符串 'false'

标签: php sql postgresql


【解决方案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) 之类的操作来确认您拥有您认为拥有的列名和值。

【讨论】:

  • 这就是我要寻找的。非常感谢!
【解决方案2】:

每次调用同一个查询时都可能返回不同的结果,因为它不是确定性的。每个表中可以有任意数量的行,从而产生结果的笛卡尔积。而且由于您的查询中没有明确的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 部分测试。

【讨论】:

  • 查询中有 where 条件。您希望我在哪个地方添加另一个 where 条件?
  • WHERE p1.id &lt; p2.id 通常适用于 许多 行。您的查询应该返回一个结果。
  • 但在这种情况下,我的表只有两行。即使这样,结果也不如预期。对于 ex using case 语句,还有其他方法可以做到这一点吗?
  • @briane:我添加了一个我会使用的查询。
  • 您的查询在 postgresql 中使用时会给出正确的结果。我的也在 postgresql 中给出了正确的结果。但我的问题是如何使用查询的“真”和“假”结果来回显“接受”或“拒绝”?
猜你喜欢
  • 2013-11-29
  • 1970-01-01
  • 2018-06-03
  • 2015-01-18
  • 2011-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多