【问题标题】: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 的纬度/经度?

【问题讨论】:

    标签: sql sql-server sql-server-2012 geography


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-13
      • 2011-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多