在SQL语句中生成变量

时间:2017-08-18 13:12:43

标签: sql oracle

我想在SQL Oracle语句中声明一个变量,以便在下一行中使用它。我写一个简单的陈述作为例子:

SELECT customer.surname, LENGTH(customer.name) long, customer.age 
FROM customer
WHERE long > 4;

我没有在网上找到任何“清晰”信息,甚至可能吗?

3 个答案:

答案 0 :(得分:2)

select语句的操作顺序与写入的顺序不同。

  1. FROM(包括连接和子查询,但随后按照子查询的操作顺序重新开始;就像代数中的操作顺序一样;从里到外)
  2. WHERE
  3. GROUP BY
  4. 选择
  5. HAVING
  6. ORDER BY
  7. 上面有一些例外,因为并非所有引擎都以这种方式处理。如果您使用mySQL,似乎您可以在组中使用别名。我不熟悉它是否会改变处理方式,或者mySQL是否只是展望未来。

    按此顺序,您可以看到在“长”之前执行的位置。生成别名,因此数据库引擎不知道它执行时的长度。换句话说,在评估where子句时,long不在范围内。

    这可以通过简单地重复where子句或嵌套查询中的计算来解决;但后者的效率较低。

    在下面我:

    • 将客户称为c,以节省打字并提高可读性。
    • 重写了where子句以使用公式而不是别名
    • 由于reserved/keyword使用而重命名了您的长别名。

    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;