在 SQL Select 语句中使用计算列

Nic*_* M. -4 sql-server query

我正在尝试编写查询。A 列来自数据库,B 列是 1 或 -1,它是查看同一个表的 CASE 语句的结果。现在,我的 C 列需要引用 B 列作为其计算的一部分(假设它是 Column_B * Column_X )。这是如何完成的,因为我无法在 SELECT 语句中使用 Column_B。

Wor*_*DBA 5

如果我正确阅读了您的问题,我认为您要问的是 - 如何在另一个计算列中使用一个计算列的结果?好吧,如果您想将该列实际添加到表中,您可以在新列中内联计算 - 这会起作用,但需要更多的维护并且可能不是理想的解决方案(这也适用于SELECT语句,但会增加维护开销):

CREATE TABLE T
( 
    A INT NOT NULL
  , X INT NOT NULL
  , (CASE A WHEN NULL THEN 0 ELSE 1 END) AS B
  , (CASE A WHEN NULL THEN 0 ELSE 1 END) * X AS C
);
Run Code Online (Sandbox Code Playgroud)

如果计算复杂,这可能会变得混乱并且难以维护。但是,您可以在表上定义基本计算,然后在顶部放置一个视图,然后可以使用您的计算列:

CREATE VIEW V
AS
SELECT A, B, B * X AS C
  FROM T;
Run Code Online (Sandbox Code Playgroud)

这是我的建议,因为它的维护非常简单,因为逻辑是孤立的。C 的计算永远不需要知道 B 是如何计算的,它只使用生成的值。如果您不喜欢那样,那么您的另一个选择是在查询中针对表本身定义逻辑,然后对其执行计算。有几种方法可以做到这一点,这里有一些我更喜欢的方法:

常用表表达式

-- CTE Method
WITH results AS
(
    SELECT A
         , (CASE A WHEN NULL THEN 0 ELSE 1 END) AS B
         , X -- don't forget to include the other columns you need!
       FROM MyTable
)
SELECT A, B, B * X AS C
   FROM results;
Run Code Online (Sandbox Code Playgroud)

子查询

-- SubQuery
SELECT A, B, B * X AS C
  FROM (SELECT A
             , (CASE A WHEN NULL THEN 0 ELSE 1 END) AS B
             , X -- don't forget to include the other columns you need!
          FROM MyTable) AS results;
Run Code Online (Sandbox Code Playgroud)

表变量

-- Total overkill, but can be done (could also use a temp table instead)
DECLARE @results TABLE
(
    A INT NOT NULL,
    B INT NOT NULL,
    X INT NOT NULL
);

INSERT @results
SELECT A
    , (CASE A WHEN NULL THEN 0 ELSE 1 END) AS B
    , X -- don't forget to include the other columns you need!
  FROM MyTable;

SELECT A, B, B * X AS C
  FROM @results;
Run Code Online (Sandbox Code Playgroud)