DB2 AS/400 iseries在where子句中使用别名

Sli*_*ipe 3 sql db2 ibm-midrange

我正在尝试在where子句中使用列的别名.例如:

SELECT col1 AS alias1, col2 + col3 as sums 
FROM my_table
WHERE sums > 10
Run Code Online (Sandbox Code Playgroud)

但后来我收到一条错误消息:

列总和不在指定的表中.

无论如何我能做到吗?

a1e*_*x07 7

如果你真的想使用别名WHERE,而不是列本身,你可以使用派生表:

SELECT a.* 
FROM
(
  SELECT lmITNO AS Item_Number, lmBANO AS Lot, lmSTAS AS Status, 
  lmRORN AS Order_Number 
  FROM MVXJDTA.MILOMA 
) a
WHERE a.Status = 'CCC'
....
Run Code Online (Sandbox Code Playgroud)


jam*_*man 6

WHERE子句中的前处理选择子句在一份声明:

WHERE子句指定一个中间结果表,该表由搜索条件为true的R行组成.R是语句的FROM子句的结果.

重写where子句以引用实际的列名:

...
WHERE A.lmSTAS = 'CCC'
...
Run Code Online (Sandbox Code Playgroud)

共表表达式可以用于预先处理选择子句.例如:

WITH A AS (SELECT 
    lmITNO AS Item_Number, 
    lmBANO AS Lot, 
    lmSTAS AS Status, 
    lmRORN AS Order_Number 
FROM MVXJDTA.MILOMA)
SELECT A.* FROM A WHERE A.Status = 'CCC'
FETCH FIRST 1000 ROWS ONLY
Run Code Online (Sandbox Code Playgroud)

CTE中的列也可以通过在table-identifier之后列出来重命名.例如:

WITH A (Item_Number, Lot, Status, Order_Number)
AS (SELECT 
    lmITNO, 
    lmBANO, 
    lmSTAS, 
    lmRORN
FROM MVXJDTA.MILOMA)
SELECT A.* FROM A WHERE A.Status = 'CCC'
FETCH FIRST 1000 ROWS ONLY
Run Code Online (Sandbox Code Playgroud)