代码之家  ›  专栏  ›  技术社区  ›  codec

如何在sql计算中使用变量

  •  0
  • codec  · 技术社区  · 4 年前

    我有一张小桌子

    [db2inst1@dashmpp-head-0 - Db2wh ~]$ db2 "select * from TEX"
    
    C1                   C2        
    -------------------- ----------
                    1000 2000      
    
      1 record(s) selected.
    

    我试着用case语句进行一个小的计算,如下所示:

    SELECT c1,
    CASE
        WHEN c1 > 0 THEN 10
        WHEN c1 = 30 THEN 5
        ELSE 1
    END AS QuantityText,
    c2,
    100 / QuantityText as UTILIZATION
    FROM TEX;
    

    这是查询的语法是正确的,但当我运行它时,我得到:

    SQL0206N  "QUANTITYTEXT" is not valid in the context where it is used.  
    SQLSTATE=42703
    

    如果不进行计算,以下查询运行良好:

    [db2inst1@dashmpp-head-0 - Db2wh ~]$ db2 "SELECT c1,
    > CASE
    >     WHEN c1 > 0 THEN 'The quantity is greater than 30'
    >     WHEN c1 = 30 THEN 'The quantity is 30'
    >     ELSE 'The quantity is under 30'
    > END AS QuantityText,
    > c2
    > FROM TEX;"
    
    C1                   QUANTITYTEXT                    C2        
    -------------------- ------------------------------- ----------
                    1000 The quantity is greater than 30 2000      
    
      1 record(s) selected.
    

    我是sql的新手,我不确定我在这里做错了什么。如何使用 QuantityText 在计算中?如果我对查询中的文本进行硬编码,它可以正常工作。

    我尝试过的:

    1. 已添加 100 / @QuantityText as UTILIZATION
    2. 已添加 100 / bigint(double(QuantityText)) as CPU_UTILIZATION
        SELECT c1,
        c2,
        100 / QuantityText as UTILIZATION FROM (
        CASE
          WHEN c1 > 0 THEN 10
          WHEN c1 = 30 THEN 5
          ELSE 1
        END AS QuantityText,
        TEX);
    
    SQL0104N  An unexpected token "CASE       WHEN" was found following 
    "UTILIZATION FROM ( ".  Expected tokens may include:  "<select>".  
    SQLSTATE=42601
    
    0 回复  |  直到 4 年前
        1
  •  1
  •   The Impaler    4 年前

    您可以使用表表达式来“命名”正在生成的表达式,这样您就可以在外部查询中进一步使用它。

    例如:

    select
      *,
      100 / QuantityText as UTILIZATION -- used here
    from (
      SELECT c1,
      CASE
        WHEN c1 > 0 THEN 10
        WHEN c1 = 30 THEN 5
        ELSE 1
      END AS QuantityText, -- named here
      c2
      FROM TEX
    ) x