gpt4 book ai didi

sql - 如何在 Oracle SQL 语句中重用动态列?

转载 作者:行者123 更新时间:2023-12-01 04:22:18 26 4
gpt4 key购买 nike

我尝试重用我在 Oracle SQL 中动态计算的一些列,例如

SELECT
A*2 AS P,
P+5 AS Q
FROM tablename

其中“tablename”有一个名为“A”的列,但没有其他列。这给了我一个
ORA-00904: "P": invalid identifier

我知道如何通过使用子查询来解决这个问题
SELECT P, P+5 AS Q
FROM ( SELECT A*2 AS P FROM tablename )

但我认为这有点丑陋。此外,我想让查询更复杂一些,例如也重用“Q”,我不想再创建另一个子查询。

更新:我想存储'P'的计算的原因是我想让它更复杂,并多次重复使用'P'。所以我不想明确地说“A*2+5 AS Q”,因为随着“P”变得越来越复杂,这很快就会变得很麻烦。

必须有一个好方法来做到这一点,有什么想法吗?

更新:我应该注意我不是数据库管理员:(。

更新:一个真实世界的例子,有一个更具体的查询。我想做的是:
SELECT 
SL/SQRT(AB) AS ALPHA,
5*LOG(10,ALPHA) AS B,
2.5*LOG(10,1-EXP(-5/ALPHA)*(5/ALPHA+1)) AS D
BS -2.74 + B + D AS BSA
FROM tablename

现在,我已经把它写出来了,它有效,但很丑:
SELECT
SL/SQRT(AB) AS ALPHA,
5*LOG(10,SL/SQRT(AB)) AS B,
2.5*LOG(10,1-EXP(-5/(SL/SQRT(AB)))*(5/(SL/SQRT(AB))+1)) AS D
BS -2.74 + 5*LOG(10,SL/SQRT(AB)) + 2.5*LOG(10,1-EXP(-5/(SL/SQRT(AB)))*((5/(SL/SQRT(AB)))+1)) AS BSA
FROM tablename

收到数据后我可以做所有这些,但我想,让我们看看我可以让数据库做多少。另外,我也想选择“BSA”(我现在可以将此查询作为子查询/带有子句)。

更新:好的,我想现在我完成了 Cade Roux 和 Dave Costa 的解决方案。尽管 Pax 和 Jens Schauder 的解决方案看起来会更好,但我不能使用它们,因为我不是 DBA。现在我不知道将谁标记为最佳答案:)。
WITH 
A1 AS (
SELECT A0.*,
SL/SQRT(AB) AS ALPHA
FROM tablename A0
),
A2 AS (
SELECT A1.*,
5*LOG(10,ALPHA) AS B,
2.5*LOG(10,1-EXP(-5/ALPHA)*((5/ALPHA)+1)) AS D
FROM A1
)
SELECT
ALPHA, B, D, BS,
BS -2.74 + B + D AS BSA
FROM A2

顺便说一句,如果有人感兴趣,SB 是星系的“表面亮度”,B 和 D 是修正项。

最佳答案

我们在 SQL Server 中也有同样的问题(这是一个 ANSI 问题)。我相信这是为了避免混淆混叠效果:

SELECT A * 2 AS A
,A * 3 AS B -- This is the original A, not the new A
FROM whatever

我们通过堆叠公用表表达式来解决它:
WITH A1 AS (
SELECT A * 2 AS A
FROM whatever
)
,A2 AS (
SELECT A1.*
,A * 3 AS B
FROM A1
)
,A3 AS (
SELECT A2.*
,A + B AS X
FROM A2
)
SELECT *
FROM A3

这是最具可读性和可维护性和可遵循性的版本。

对于 UPDATE,有一个使用 column_name = notation 的已弃用 SQL Server 解决方法,您可以在其中引用列表中先前已更新的列。但这不能在 SELECT 中使用。

我希望将来某个时候将一些堆叠表达式的能力(不使用标量 UDF)添加到 ANSI SQL 中。

关于sql - 如何在 Oracle SQL 语句中重用动态列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/743772/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com