如何测试 SQL Server Geography 列的值是不是为 POINT(0 0)?

Posted

技术标签:

【中文标题】如何测试 SQL Server Geography 列的值是不是为 POINT(0 0)?【英文标题】:How to test if a SQL Server Geography column value is POINT(0 0)?如何测试 SQL Server Geography 列的值是否为 POINT(0 0)? 【发布时间】:2015-04-15 06:09:50 【问题描述】:

以下代码可以运行,但速度非常慢:

select top 100 FooId
from dbo.Foos
where latitudelongitude.ToString() = 'POINT(0,0)'
order by FooId desc

有没有更好的方法来确定GEOGRAPHY 值是否具有0,0 的纬度/经度?

【问题讨论】:

【参考方案1】:

翻转哟测试,哟。 ;)

declare @g geography = geography::STPointFromText('POINT(0 0)', 4326);

select * 
from dbo.Foos 
where latitudelongitude.STEquals(@g) = 1

换句话说,您最初编写的查询不是 SARGable。我写的就是。

【讨论】:

你试过了吗?好吧,我做了我的第一次尝试。失败:Invalid operator for data type. Operator equals equal to, type equals geography.。然后我尝试了 OP 中的建议。下次请在给出答案之前进行测试。 不,你没有第一次尝试。您尝试了一些非常相似的方法,但不一样(因为没有 SRID 就不能拥有地理实例)。但你是对的;我没有先测试它。我现在已经并相应地更新了我的答案。下一次,请检查您的语气是否有人试图免费帮助您解决您遇到的问题。 啊! STEquals ...我以前从未使用过 :) 嗯。我想知道什么更高效.... 试试看,但我知道 STEquals 受空间索引支持,所以我愿意花钱。 这更高效 :) 答案交换了。 (更新):是的。空间索引有帮助 - 你是赢家!【参考方案2】:

您可以使用.Lat.Long 来实现这一点。像这样的

SELECT TOP 100 FooId
FROM dbo.Foos
WHERE latitudelongitude.Lat = 0 AND latitudelongitude.Long = 0
ORDER BY FooId desc

【讨论】:

以上是关于如何测试 SQL Server Geography 列的值是不是为 POINT(0 0)?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server GEOGRAPHY STIntersection 更改点顺序

在 Django 中使用 GEOGRAPHY 列更新 SQL Server 表

确定一个 POINT 是不是位于 LINESTRING 上的两个其他 POINT 之间(SQL Server 2008 Geography)

为啥 SQL Server GEOGRAPHY 允许 -15069° 和 +15069° 之间的经度?为啥是±15069°?

SQL Server - 地理

SQL Server Spatial 中的 STIntersects,可能是一个错误