在 SELECT 语句中引用表达式的别名

Reference an alias for an expression in a SELECT statement

我有以下 select 语句创建表达式“newdate”,然后在另一个名为“newname”的表达式中引用:

SELECT
Iif([DateColumn1]='',Format(CONVERT(DATE,Dateadd(day,RIGHT([DateColumn2],3)-1,CONVERT(DATETIME,LEFT([DateColumn2],4)))),'MMddyy'),Format(CONVERT(DATE,Dateadd(day,RIGHT(datecolumn3],3)-1,CONVERT(DATETIME,LEFT([DateColumn3],4)))),'MMddyy')) AS **newdate**,

Upper(LEFT(Rtrim([NameColumn4]),19)+''+[newdate]+''+RIGHT([NameColumn5],3)) AS newname

FROM   table1

出于某种原因,当 运行 出现此错误时,我收到无效列的错误,它指的是我创建的“newdate”表达式。 “newdate”表达式工作正常,但是当我为“newname”添加第二个表达式时它停止工作。 有没有办法在另一个也有别名的表达式中将一个表达式作为别名引用?

您不能在创建别名的同一范围内引用别名 - 如果您希望避免重复逻辑,可以在 sub-query 中创建它。

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'),FORMAT(CONVERT(DATE,DATEADD(DAY,RIGHT(datecolumn3],3)-1,CONVERT(DATETIME,LEFT([DateColumn3],4)))),'MMddyy')) AS NewDate
  FROM table1
) X

你不能。但是 SQL 服务器有一个非常漂亮的功能,您可以使用 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服务器中,有一个叫做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 在另一个答案中提出了建议
  • 常用Table表达式下面给出
;WITH CTE_NewDate AS
(
SELECT
Iif([DateColumn1]='',Format(CONVERT(DATE,Dateadd(day,RIGHT([DateColumn2],3)-1,CONVERT(DATETIME,LEFT([DateColumn2],4)))),'MMddyy'),Format(CONVERT(DATE,Dateadd(day,RIGHT(datecolumn3],3)-1,CONVERT(DATETIME,LEFT([DateColumn3],4)))),'MMddyy')) AS newdate,
NameColumn4, NameColumn5

FROM   table1
)
SELECT newDate, Upper(LEFT(Rtrim([NameColumn4]),19)+''+[newdate]+''+RIGHT([NameColumn5],3)) AS newname
FROM CTE_NewDate