计算列上的 T-SQL 列别名 - 列名无效

Posted

技术标签:

【中文标题】计算列上的 T-SQL 列别名 - 列名无效【英文标题】:T-SQL Column alias on computed column - Invalid column name 【发布时间】:2011-07-06 03:13:31 【问题描述】:

我使用别名来引用计算列。这是我正在尝试制作的实际代码中的一个 sn-p,用于计算相似度并返回相似度得分为 3 或更高的匹配项。

select [FirstName], difference([FirstName], 'mitch') as similarity
from [Dev].[dbo].[Name]
where similarity > 2
order by similarity desc

异常消息:

列名“相似性”无效。

由于相似性不是一个真实的列,我将如何进行这项工作?

【问题讨论】:

"Invalid column name" error on SQL statement from OpenQuery results的可能重复 【参考方案1】:

列别名和计算在查询的投影 (SELECT) 阶段执行,该阶段发生在选择(WHEREJOIN)阶段之后。因此,它们不能在WHERE 子句或JOIN 条件中引用,因为它们尚不存在。您可以将查询与 SELECT 子句一起用作子查询,也可以在 WHERE 子句中重复计算:

select * 

from
(select [FirstName], difference([FirstName], 'mitch') as similarity
from [Dev].[dbo].[Name]) src

where similarity > 2
order by similarity desc

select [FirstName], difference([FirstName], 'mitch') as similarity
from [Dev].[dbo].[Name]
where difference([FirstName], 'mitch') > 2
order by similarity desc

【讨论】:

【参考方案2】:

所有答案都可以解决您的问题,但对于复杂的情况,您无法复制您的查询。

正确的方法是使用CROSS and APPLY

select [FirstName], similarity
from [Dev].[dbo].[Name]
cross apply
  (
     select similarity =
     difference([FirstName], 'mitch')  
  )computed_column
where similarity > 2
order by similarity desc

通过 CROSS 和 APPLY,您可以在查询的任何地方使用计算列

【讨论】:

我认为这应该是答案。请注意,您需要给交叉应用一个名称。在这种情况下,即使没有使用“computed_column”别名,您仍然必须定义/包含它。保持干燥!【参考方案3】:

试试:

SELECT * 
  FROM (
        SELECT [FirstName], difference([FirstName], 'mitch') as similarity
            FROM [Dev].[dbo].[Name]
        ) a
WHERE similarity > 2
ORDER BY similarity desc

【讨论】:

【参考方案4】:
select [FirstName], difference([FirstName], 'mitch') as similarity
from [Dev].[dbo].[Name]
where difference([FirstName], 'mitch') > 2
order by 2 desc

不能在 where 子句中引用列别名

【讨论】:

以上是关于计算列上的 T-SQL 列别名 - 列名无效的主要内容,如果未能解决你的问题,请参考以下文章

从 T-SQL 导出到 Excel 的问题,包括列名和未导出的列上的排序

特定列上的SQL内部联接

熊猫合并:合并同一列上的两个数据框,但保留不同的列

SQL中用别名无效??

无效的列名异常 - 使用别名的 JdbcPagingItemReader 查询

datagridview控件的列名与DataSet中列名对应