Sql server CASE语句中的SQL-Alias

Sql server CASE语句中的SQL-Alias,sql-server,Sql Server,我有这段代码,请看下面。我不断收到错误:无效的列名“SuppFinish2” SELECT CASE WHEN [RegFinish] IS NULL THEN '' ELSE [RegFinish] END AS [RegFinish], CASE WHEN [SuppFinish] IS NULL THEN '' ELSE [SuppFinish] END AS [SuppFinish2], CASE WHEN [RegFinish]<[S

我有这段代码,请看下面。我不断收到错误:无效的列名“SuppFinish2”

SELECT

CASE
    WHEN [RegFinish] IS NULL THEN ''
    ELSE [RegFinish]
END AS [RegFinish],

CASE
    WHEN [SuppFinish] IS NULL THEN ''
    ELSE [SuppFinish]
END AS [SuppFinish2],

CASE
    WHEN [RegFinish]<[SuppFinish2] THEN '1'
    ELSE '0'
END AS [TEST]

FROM TABLE

是否因为[SuppFinish2]是别名?谢谢

为了引用别名列,可以使用派生表或CTE,但此处未显示

Select *, CASE
WHEN [RegFinish]<[SuppFinish2] THEN '1'
ELSE '0'
END AS [TEST] From
(
SELECT

CASE
    WHEN [RegFinish] IS NULL THEN ''
    ELSE [RegFinish]
END AS [RegFinish],

CASE
    WHEN [SuppFinish] IS NULL THEN ''
    ELSE [SuppFinish]
END AS [SuppFinish2]
) T1
FROM TABLE

正如您所说,它的“由于别名”和“别名”列只能在order by to逻辑查询流order上引用

with cte
as
(
SELECT
CASE
    WHEN [RegFinish] IS NULL THEN ''
    ELSE [RegFinish]
END AS [RegFinish],

CASE
    WHEN [SuppFinish] IS NULL THEN ''
    ELSE [SuppFinish]
END AS [SuppFinish2]
FROM TABLE
)
select 
CASE
    WHEN [RegFinish]<[SuppFinish2] THEN '1'
    ELSE '0'
END AS [TEST]
from cte

您不能同时在SELECT子句中设置和访问别名。我建议使用交叉应用重写您的查询:


您不能在创建别名的同一级别使用这些别名,因为它们还不存在。。用另一个选择将查询包装起来,如下所示:

SELECT * ,
       CASE
            WHEN [RegFinish]<[SuppFinish2] THEN '1'
            ELSE '0'
       END AS [TEST]
FROM (
    SELECT
        [ID],
        CASE
            WHEN [RegFinish] IS NULL THEN ''
            ELSE [RegFinish]
        END AS [RegFinish],
        CASE
            WHEN [SuppFinish] IS NULL THEN ''
            ELSE [SuppFinish]
        END AS [SuppFinish2],
    FROM TABLE)

为什么不使用ISNULL而不是CASE?您的查询存在的问题是[SuppFinish2]是别名而不是列,只能在ORDER BY子句中使用

考虑ISNULL而不是CASE您不能引用SELECT子句中选择的其他字段。比较RegFinish<可能不是您想要的,描述当SuppFinish为空时该条件的逻辑诚实的问题:cross apply如何比使用CTE或派生表更好?@Jeremy我想这只是语法上的甜点。依我的口味,这样看起来更紧凑、更干净。谢谢!如何将另一列添加到此查询中?例如,我想从同一个表中添加[ID]。@atomoutside已更新,只需像我所想的那样放入内部查询。再次感谢。
SELECT * ,
       CASE
            WHEN [RegFinish]<[SuppFinish2] THEN '1'
            ELSE '0'
       END AS [TEST]
FROM (
    SELECT
        [ID],
        CASE
            WHEN [RegFinish] IS NULL THEN ''
            ELSE [RegFinish]
        END AS [RegFinish],
        CASE
            WHEN [SuppFinish] IS NULL THEN ''
            ELSE [SuppFinish]
        END AS [SuppFinish2],
    FROM TABLE)
SELECT ISNULL([RegFinish],'') as  [RegFinish]
     , ISNULL([SuppFinish],'') as [SuppFinish2], CASE 
WHEN  
  ISNULL([RegFinish],'') < ISNULL([SuppFinish],'') THEN 1
                                                   ELSE 0 
END  AS [TEST]
FROM TABLE