where子句中的列别名给出了无效的列名错误

时间:2014-10-14 19:35:52

标签: sql sql-server sql-server-2005

这是一个简单的问题,我已经挂断了。我想知道我是否可以创建一个列别名,然后在我的WHERE子句中使用它,即:

SELECT TRACTOR, CONVERT(VARCHAR, ORDER) AS NUMBER
FROM TABLE
WHERE NUMBER = '4'

请记住,这只是我正在尝试做的一个例子。我正在运行的查询有点复杂,但只是如何创建变量然后在子句中使用它的基本思路。

我的问题是关于where子句中的别名列。我有一个查询在一个数据库中查找发票号,并将其与另一个数据库中字段的前7位数匹配。当我们只有6位数时查询工作正常,但现在我们有7位,我收到错误,我正试图以不同的方式重写查询。

2 个答案:

答案 0 :(得分:6)

重复使用别名列是CROSS APPLY的一个很好的用例:

SELECT t.TRACTOR, CxA.Num
FROM TABLE t
CROSS APPLY
  (SELECT CONVERT(VARCHAR(10), ORDER)) CxA(Num)
WHERE CxA.Num = '4'

CROSS APPLY中的任何内容都可以在SELECTWHEREORDER BY等中引用,但有一些限制(通常如果您在{{1}中有聚合表达)。

答案 1 :(得分:2)

看看:http://sqlmag.com/t-sql/working-variables-t-sql-part-1

变量的基本语法如下:

declare @id int
select @id = 1

select *
from myTable
where id = @id

编辑:如果你实际上在你的where子句中询问列别名而不是sql变量,请看看这个SO问题:Referring to a Column Alias in a WHERE Clause

EDITx2:

针对您的具体情况(假设询问列别名),您可以执行以下操作:

SELECT *
FROM (
    SELECT TRACTOR, CONVERT(VARCHAR(100), ORDER) AS NUMBER
    FROM TABLE
) someTableAlias
WHERE NUMBER = '4'

虽然您可能想重新考虑您的列名...我认为编号和顺序都是保留字,应尽可能避免。你可以通过使用[order]和[number]来解决这些问题,我相信,但最好还是避免使用保留字作为列/表/ whatevers。