如何解决在SELECT语句中引用表达式的别名
我有以下选择语句,该语句创建表达式“ newdate”,然后引用另一个名为“ newname”的表达式:
SELECT
Iif([DateColumn1]='',Format(CONVERT(DATE,Dateadd(day,RIGHT([DateColumn2],3)-1,CONVERT(DATETIME,LEFT([DateColumn2],4)))),'MMddyy'),RIGHT(datecolumn3],LEFT([DateColumn3],'MMddyy')) AS **newdate**,Upper(LEFT(Rtrim([NameColumn4]),19)+''+[newdate]+''+RIGHT([NameColumn5],3)) AS newname
FROM table1
由于某种原因,运行此命令时会收到无效列错误,它引用了我创建的“ newdate”表达式。 “ newdate”表达式可以正常工作,但是当我为“ newname”添加第二个表达式时,它停止工作。 有没有办法将一个表达式引用为另一个也具有别名的表达式中的别名?
解决方法
您不能在与创建别名相同的范围内引用别名-如果希望避免重复逻辑,则可以在子查询中创建别名。
SELECT
UPPER(LEFT(RTRIM([NameColumn4]),19)+''+[newdate]+''+RIGHT([NameColumn5],3)) AS [NewName]
FROM (
SELECT NameColumn4,NameColumn5,IIF([DateColumn1]='',FORMAT(CONVERT(DATE,DATEADD(DAY,RIGHT([DateColumn2],3)-1,CONVERT(DATETIME,LEFT([DateColumn2],4)))),'MMddyy'),RIGHT(datecolumn3],LEFT([DateColumn3],'MMddyy')) AS NewDate
FROM table1
) X
,
不能。但是SQL Server具有一个非常漂亮的功能,您可以使用apply
在 from 子句中定义列:
SELECT v.newdate,Upper(LEFT(Rtrim(t1.[NameColumn4]),19) + v.newdate + RIGHT(t1.[NameColumn5],3)) AS newname
FROM table1 t1 CROSS APPLY
(VALUES ( <complicated expression here)
) v(newdate)
,
在SQL Server中,有一个称为ALL AT ONCE的概念,其中所有操作都在逻辑查询执行阶段(此处为SELECT)。因此,您在此处面临问题。
Detailed Information on All at Once
SELECT FirstName + LastName AS FullName,Salutation + FullName -- Will throw error here
FROM TableName
您可以通过多种方式处理该问题:
- 子查询 Dale K在另一个答案中提出了建议
- 公用表表达式下面给出的
;WITH CTE_NewDate AS
(
SELECT
Iif([DateColumn1]='',Format(CONVERT(DATE,Dateadd(day,'MMddyy')) AS newdate,NameColumn4,NameColumn5
FROM table1
)
SELECT newDate,Upper(LEFT(Rtrim([NameColumn4]),3)) AS newname
FROM CTE_NewDate
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。