t-sql - where 子句中的动态列

标签 t-sql sql-server-2008

我正在尝试执行这样的查询:

SELECT Id,Name,Distance=dbo.CalculateDistance(Lat,Lon,@lat,@lon)
FROM Requests
WHERE Distance < 2
ORDER BY Distance DESC

错误说,没有距离列。 我尝试过一次,但它会降低查询性能

SELECT Id,Name,Distance=dbo.CalculateDistance(Lat,Lon,@lat,@lon)
FROM Requests
WHERE dbo.CalculateDistance(Lat,Lon,@lat,@lon) < 2
--ORDER BY Distance DESC

在不进行第二次计算的情况下,如何实现上述查询?
致以诚挚的问候
迈拉

最佳答案

我发现下面的链接建议您对其值进行嵌套选择和过滤;在这种情况下,标量计算将仅执行一次。

所以你应该能够做类似的事情

        SELECT Id, Name, Distance FROM (
        SELECT Id,Name,Distance=dbo.CalculateDistance(Lat,Lon,@lat,@lon)
        FROM Requests) derived 
        WHERE Distance < 2 
        ORDER BY Distance DESC 

我简单地看了一下执行计划,标量计算只发生一次。但您当然应该检查索引等的使用。

我希望它能提供一些帮助。

Avoid Transact-SQL's Column Alias Limitations

关于t-sql - where 子句中的动态列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6262244/

相关文章:

sql - T-SQL 使用来自字段表中字符串的整个 WHERE 条件

sql-server - DELETE ... WHERE ... NOT IN (...) 的现代替代方案?

sql - (SQL Server 2005) 管理大量插入语句的好方法?

sql - 通过临时表连接 SQL Server

sql - 将表内部连接到自身

sql - 当给定的列值为零时,如何使用上一行的值?

SQL 2000/2005/2008 - 查找列的唯一约束名称

sql - 用先前的 NOT NULL 行更新 NULL 行

sql-server-2008 - SQL 服务器修剪

sql-server - SQL Server 双向事务复制 - 这是一个好的用例吗?