【问题标题】:Select Statement - Use Created Column to Manipulate选择语句 - 使用创建的列进行操作
【发布时间】:2021-02-23 15:07:48
【问题描述】:

如何在 SQL Server Select 语句中使用创建的变量并在之后对其进行操作?出于示例的目的,我想从列 No_Grade 创建一个二进制列。

SELECT r.[ID], r.[Grade1], r.[Grade2], r.[Grade3], r.[Grade4], 

(case when (r.[Grade1] = r.[Grade2]) then r.[Rod1Grade]
else '' END) as No_Grade,

(case when No_Grade is null then 1 else 0 END) as Yes_Grade

FROM [DB].[TABLE] as r 

第二个case statement 出现错误Incorrect syntax near 'case'.

【问题讨论】:

  • 您的查询没有意义——尽管我没有发现那个特定的错误。 No_grade 不能是 NULL,那你为什么要检查那个条件呢? (无论如何,检查都不起作用,但逻辑​​已关闭。)
  • 仅供参考,您不需要将每个表达式都放在括号中。 CASE WHEN A = B THEN 1 ELSE 0 END 也完全有效。还要注意CASE 是一个表达式; SQL Server 不支持Case (Switch) 语句。
  • 至于错误,我不希望你有这个错误,但没有找到 No_Grade 列。您不能在同一 SELECT 中通过它的别名来引用一列。

标签: sql sql-server select


【解决方案1】:

在 SQL Server 中,我建议使用 APPLY -- 将定义移至 FROM 子句:

SELECT r.[ID], r.[Grade1], r.[Grade2], r.[Grade3], r.[Grade4], 
       v.No_Grade,
       (case when v.No_Grade is null then 1 else 0 END) as Yes_Grade
FROM [DB].[TABLE] r CROSS APPLY
     (VALUES (case when r.[Grade1] = r.[Grade2] then r.[Rod1Grade]
              end)
     ) v(no_grade);

请注意,我删除了 else 子句,因此该值实际上可以是 NULL

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-29
    • 2021-09-17
    • 2021-12-28
    • 1970-01-01
    相关资源
    最近更新 更多