Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 如何在SQL Server的where子句中使用别名列名_Sql Server 2005 - Fatal编程技术网

Sql server 2005 如何在SQL Server的where子句中使用别名列名

Sql server 2005 如何在SQL Server的where子句中使用别名列名,sql-server-2005,Sql Server 2005,当我试图在SQLServer2005中执行以下代码时,我得到了错误 无效的列名DistanceFromAddress 代码: 我使用select语句正确地获取了值,但是当我试图检查DistanceFromAddress

当我试图在SQLServer2005中执行以下代码时,我得到了错误

无效的列名DistanceFromAddress

代码:

我使用select语句正确地获取了值,但是当我试图检查DistanceFromAddress<2的条件时,我得到了错误

如何解决此问题?

WHERE子句在SELECT子句*之前处理,因此别名不可用。移动到使用子查询或-以下是CTE:

; with Distances as (
    select SQRT(POWER(cast(Program_Latitude as float) - cast('41.5126237' as float), 2) +   
 POWER(cast(Program_Longitude as float) - cast('-81.6516411' as float), 2)) * 62.1371192 
 AS DistanceFromAddress
    from tblProgram
)
select * from Distances where DistanceFromAddress < 2
*-好的,系统可以根据自己的需要自由地重新排序操作,只要结果是SQL语句是在特定的时间内处理的。当然,SQL Server出现这些问题的地方是,由于SELECT子句中的行/值转换问题,where子句应该消除这些问题

或者你可以重复这个表达式。这使您的查询更难维护,但在某些情况下,这可能适合您。例如,如果您不想返回实际距离,而只想返回该距离处的兴趣点的名称。在这种情况下,您只需要在where子句中使用表达式,在这种情况下,维修性参数就消失了,这个解决方案是一个完美的替代方案

select 
  tblProgram.POIname
  /* Only if you need to return the actual value
  , SQRT(
    POWER(cast(Program_Latitude as float) - cast('41.5126237' as float), 2) +
    POWER(cast(Program_Longitude as float) - cast('-81.6516411' as float), 2)
  ) * 62.1371192 AS DistanceFromAddress */
from tblProgram
where 
  -- Use this if you only want to filter by the value.
  SQRT(
    POWER(cast(Program_Latitude as float) - cast('41.5126237' as float), 2) +
    POWER(cast(Program_Longitude as float) - cast('-81.6516411' as float), 2)
  ) * 62.1371192 < 2

不能在WHERE子句中使用别名列。您可以尝试使用派生表。可能是这样的抱歉,未经测试:

SELECT * FROM
(SELECT SQRT(POWER(cast(Program_Latitude as float) - cast('41.5126237' as float), 2) +   
 POWER(cast(Program_Longitude as float) - cast('-81.6516411' as float), 2)) * 62.1371192 
 AS DistanceFromAddress from tblProgram) mytable
WHERE DistanceFromAddress < 2

我认为您只能使用AS来显示最终值。要进行比较,应该从其中的另一个select语句返回select

比如:

您可以试试这个。

选择 t1.*, t2.品牌名称, t3.类别名称, 如果 t3.父类id=0, t3.cat_钥匙, 选择 concatt3b.cat_键“/”,t3.cat_键 来自master_类别t3b 其中t3b.category\u id=t3.parent\u category\u id 作为cat_键, 选择mint4.product\u MSP 来自trans_产品t4 其中t1.product_id=t4.product_id 作为产品(MSP),, 选择mint4.product\u MRP 来自trans_产品t4 其中t1.product_id=t4.product_id as product\U MRP 来自master_products t1, 大师牌t2, t3类硕士 其中t1.status=1 和t2。状态=1 t2.品牌标识=t1.品牌标识 t3.类别id=t1.类别id 和t3。显示_状态=1 和t1.类别_id=6 以及介于“1000”和“500000”之间的产品_MSP
可能重复I quess,只需复制表达式it WHERE子句将给出比此处答案中建议的子问题更好的计划。@Vadzim-你为什么会猜到?这些表达式似乎是确定性的。除非优化器有休息日,否则它应该能够确保每行只计算它们一次,无论表达式出现在何处/多少次。欢迎使用堆栈溢出!虽然这段代码可以解决这个问题,但如何以及为什么解决这个问题将真正有助于提高您的帖子质量,并可能导致更多的投票。请记住,你是在将来回答读者的问题,而不仅仅是现在提问的人。请在回答中添加解释,并说明适用的限制和假设。这种方法对我很有效。谢谢
select d.DistanceFromAddress
from
  (select 
    SQRT(
      POWER(cast(Program_Latitude as float) - cast('41.5126237' as float), 2) +
      POWER(cast(Program_Longitude as float) - cast('-81.6516411' as float), 2)
    ) * 62.1371192 AS DistanceFromAddress 
  from tblProgram) d
where d.DistanceFromAddress < 2
select 
  tblProgram.POIname
  /* Only if you need to return the actual value
  , SQRT(
    POWER(cast(Program_Latitude as float) - cast('41.5126237' as float), 2) +
    POWER(cast(Program_Longitude as float) - cast('-81.6516411' as float), 2)
  ) * 62.1371192 AS DistanceFromAddress */
from tblProgram
where 
  -- Use this if you only want to filter by the value.
  SQRT(
    POWER(cast(Program_Latitude as float) - cast('41.5126237' as float), 2) +
    POWER(cast(Program_Longitude as float) - cast('-81.6516411' as float), 2)
  ) * 62.1371192 < 2
SELECT * FROM
(SELECT SQRT(POWER(cast(Program_Latitude as float) - cast('41.5126237' as float), 2) +   
 POWER(cast(Program_Longitude as float) - cast('-81.6516411' as float), 2)) * 62.1371192 
 AS DistanceFromAddress from tblProgram) mytable
WHERE DistanceFromAddress < 2
SELECT a.disfromaddr FROM
 ( SELECT SQRT(POWER(cast(Program_Latitude as float) - cast('41.5126237' as float), 2) +   
 POWER(cast(Program_Longitude as float) - cast('-81.6516411' as float), 2)) * 62.1371192 
 AS DistanceFromAddress FROM tblProgram) 
a WHERE a.disfromaddr < 2