无法识别SQL as关键字

无法识别SQL as关键字,sql,sql-server,Sql,Sql Server,我正在编辑一个存储过程,以获取距离并从中排序。我使用的查询正在处理另一个存储过程 SELECT *, ( ACOS( COS( RADIANS( 41.993000000 ) ) * COS( RADIANS( u.real_users_lat ) ) * COS( RADIANS( u.real_users_long ) - RADIANS( -87.696207000 ) ) + SIN( RADIANS

我正在编辑一个存储过程,以获取距离并从中排序。我使用的查询正在处理另一个存储过程

    SELECT  *,


( 
    ACOS( COS( RADIANS( 41.993000000  ) ) 
          * COS( RADIANS( u.real_users_lat ) )
          * COS( RADIANS( u.real_users_long ) - RADIANS( -87.696207000 ) )
          + SIN( RADIANS( 41.993000000  ) )
          * SIN( RADIANS( u.real_users_lat ) )
      )
    * 6371
    ) AS distance_in_km

FROM products
LEFT JOIN users u on u.id = products.created_by
LEFT JOIN product_categories on product_categories.product_id = products.id
WHERE products.starting_bid <= @price and product_categories.category_id = @category_id
ORDER BY 
     CASE WHEN @sort_direction = 'asc' THEN products.date_created END asc,
     CASE WHEN @sort_direction = 'desc' THEN products.date_created END desc,
    CASE WHEN @sort_distance = 'nearest' THEN distance_in_km END desc,
    CASE WHEN @sort_distance = 'farthest' THEN distance_in_km END asc

END

请告诉我我做错了什么。

你没有做错什么。SQL server根本不允许以这种方式使用别名列。一个直接的WHERE是可以的,但是不能在表达式中使用它们

别问我为什么

如果需要这样做,那么将SELECT语句包装在CTE或内联视图中,这样就可以了

在末端还有一个额外的末端;不过,也许这只是这个问题的复制粘贴问题

这应该使用内联视图关闭

SELECT  *,distance_in_km
FROM products
LEFT JOIN 
(select *, ( 
    ACOS( COS( RADIANS( 41.993000000  ) ) 
          * COS( RADIANS( u.real_users_lat ) )
          * COS( RADIANS( u.real_users_long ) - RADIANS( -87.696207000 ) )
          + SIN( RADIANS( 41.993000000  ) )
          * SIN( RADIANS( u.real_users_lat ) )
      )
    * 6371
    ) AS distance_in_km
from users) u on u.id = products.created_by
LEFT JOIN product_categories on product_categories.product_id = products.id
WHERE products.starting_bid <= @price and product_categories.category_id = @category_id
ORDER BY 
     CASE WHEN @sort_direction = 'asc' THEN products.date_created END asc,
     CASE WHEN @sort_direction = 'desc' THEN products.date_created END desc,
    CASE WHEN @sort_distance = 'nearest' THEN distance_in_km END desc,
    CASE WHEN @sort_distance = 'farthest' THEN distance_in_km END asc

Eraper的回答显示了CTE的一般技术。

Jovin,您不能在创建的SQL中直接使用计算列

我的意思是,跟随是行不通的

declare @sort varchar(5) = 'desc'
select [name], trim([name]) as tname
from sys.tables
order by 
    case when @sort = 'desc' then tname end desc,
    case when @sort = 'asc' then tname end asc
您可以执行以下操作之一

declare @sort varchar(5) = 'desc'
select [name], trim([name]) as tname
from sys.tables
order by 
    case when @sort = 'desc' then trim([name]) end desc,
    case when @sort = 'asc' then trim([name]) end asc
或者只是用表达

declare @sort varchar(5) = 'desc'
;with cte as (
    select [name], trim([name]) as tname
    from sys.tables
) 
select *
from cte
order by 
    case when @sort = 'desc' then tname end desc,
    case when @sort = 'asc' then tname end asc

我认为我们无法重现您的问题,因为我认为您的第一个查询没有问题。请给我们一个可复制的示例。您为什么不使用自2008年以来内置在SQL Server中的地理数据类型,而不是手动实现地理计算?嗨,Damien,当我试图找到一个地理解决方案来获取最近和最远的位置时,这是我在stack overflow上发现的,基本上我听说地理数据库值很难使用。但是在第二个查询中,我使用了distance_in_km作为order by属性,它起作用了吗?是的,当直接使用时,它在order by上起作用。你失败的例子是一个复杂的表达式。表达式部分不允许这样做,按部分排序也不允许这样做。@Jovin-我可以确认按\u别名\u列排序有效,但按大小写排序当x<20时,则\u别名\u列结束不起作用。就是这个和额外的结尾。这个复杂的表达式是地理查询的开始,对吗?表达部分是什么?谢谢你的帮助。我所指的复杂表达式就是orderby的情况。抱歉没有说清楚。等等,我把整个函数放在order by函数中then关键字之后了?当我基本上做了与第一个相同的事情时,为什么第二个可以排序呢?感谢您的帮助。您可以按顺序在标准SQL中使用别名,因为它是在创建选择列表后进行逻辑处理的。奇怪的是,SQL Server不允许在这种情况下使用它。我实际上更喜欢在这种情况下使用CTE,因为结果是以某种方式计算并存储在内存或临时表中的,然后,使用CTE列名进行排序会更加清晰,并避免在SQL脚本的不同部分重复代码
declare @sort varchar(5) = 'desc'
;with cte as (
    select [name], trim([name]) as tname
    from sys.tables
) 
select *
from cte
order by 
    case when @sort = 'desc' then tname end desc,
    case when @sort = 'asc' then tname end asc