我正在尝试编写查询。A 列来自数据库,B 列是 1 或 -1,它是查看同一个表的 CASE 语句的结果。现在,我的 C 列需要引用 B 列作为其计算的一部分(假设它是 Column_B * Column_X )。这是如何完成的,因为我无法在 SELECT 语句中使用 Column_B。
如果我正确阅读了您的问题,我认为您要问的是 - 如何在另一个计算列中使用一个计算列的结果?好吧,如果您想将该列实际添加到表中,您可以在新列中内联计算 - 这会起作用,但需要更多的维护并且可能不是理想的解决方案(这也适用于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)
归档时间: |
|
查看次数: |
26102 次 |
最近记录: |