我想在SQL Oracle语句中声明一个变量,以便在下一行中使用它。我写一个简单的陈述作为例子:
SELECT customer.surname, LENGTH(customer.name) long, customer.age
FROM customer
WHERE long > 4;
我没有在网上找到任何“清晰”信息,甚至可能吗?
答案 0 :(得分:2)
select语句的操作顺序与写入的顺序不同。
上面有一些例外,因为并非所有引擎都以这种方式处理。如果您使用mySQL,似乎您可以在组中使用别名。我不熟悉它是否会改变处理方式,或者mySQL是否只是展望未来。
按此顺序,您可以看到在“长”之前执行的位置。生成别名,因此数据库引擎不知道它执行时的长度。换句话说,在评估where子句时,long不在范围内。
这可以通过简单地重复where子句或嵌套查询中的计算来解决;但后者的效率较低。
在下面我:
SELECT c.surname, LENGTH(customer.name) as Name_Len, c.age
FROM customer as c
WHERE LENGTH(c.name)> 4;
在下一个示例中,我们使用with
关键字生成一组名为CTE(公用表表达式)的数据,其长度为计算的名称。这实际上改变了where子句的处理顺序。
在这种情况下,在CTE中处理FROM,然后选择包括我们的计算值但不应用where子句。然后运行第二个查询,从具有where子句的CTE数据集中进行选择。由于第一个数据集已经计算了Name_Len,我们现在可以在where子句中使用它。
WITH CTE AS (SELECT c.surname, LENGTH(customer.name) as Name_Len, c.age
FROM customer as c)
SELECT *
FROM CTE
WHERE Name_Len > 4;
这也可以作为子查询来完成;但是在嵌套其中的一些之后,你可以看到使用with可以使它更容易阅读/维护。
SELECT CTE.*
FROM (SELECT c.surname, LENGTH(customer.name) as Name_Len, c.age
FROM customer as c) as CTE
WHERE CTE.Name_Len > 4;
答案 1 :(得分:1)
虽然SQL中存在问题解决方案,但您提出问题的方式仍然不正确。
id dx dia01 dia02 dia03 dia04 dia05 dia06 dia07 dia08 dia09
a 1 S06.4 6.7 7 6.5 7 7.2 <NA> <NA> 6.6 6.7
b 2 S06.2 5 <NA> 4.9 7.8 9.3 8 7.8 8 <NA>
c 3 S06.5 7 5.5 <NA> <NA> 7.2 8 7.6 <NA> 6.7
此处的子查询称为SELECT *
FROM (SELECT customer.surname,
LENGTH (customer.name) col_long,
customer.age
FROM customer)
WHERE col_long > 4;
视图。有关更多详细信息,请在线查看Oracle文档。
此外,LONG是一个保留关键字,因此要么重命名要么使用“long”。
答案 2 :(得分:0)
DECLARE aVariable NUMBER;
BEGIN
SELECT someColumn INTO aVariable FROM aTable;
END;