DB2 SQL查询where子句中的别名

时间:2019-05-15 18:52:28

标签: sql db2

有没有一种方法可以使用别名进行查询

SELECT 
   'X' AS AVC
 FROM 
   sysibm.sysdummy1
 WHERE AVC= 'X'

我只是在寻找一种方法,可以查询别名列。

我收到以下错误。

Error: DB2 SQL Error: SQLCODE=-206, SQLSTATE=42703, SQLERRMC=AVC, 
DRIVER=3.63.75
SQLState:  42703
ErrorCode: -206
Error: DB2 SQL Error: SQLCODE=-514, SQLSTATE=26501, SQLERRMC=SQL_CURLH200C1, 
DRIVER=3.63.75
SQLState:  26501
ErrorCode: -514

任何输入都会有所帮助!

谢谢!

3 个答案:

答案 0 :(得分:0)

您不能在where条件中使用别名,因为sql引擎按特定顺序对查询子句(FROM,WHERE,SELECT ...)进行评估,而select子句在where子句之后进行评估

因此,在当前数据库引擎不知道列别名的位置

您必须重复代码

SELECT 'X' AS AVC
FROM  sysibm.sysdummy1
WHERE X' = 'X' 

答案 1 :(得分:0)

不能。这是SQL的一般规则。实际上,您可以认为原因是whereselect之前被解析,因此别名是未知的。

一般的解决方案是使用子查询或CTE:

SELECT t.*
FROM (SELECT 'X' AS AVC
      FROM sysibm.sysdummy1
     ) t
WHERE AVC = 'X';

我的首选解决方案是使用横向联接,但我认为DB2不支持APPLYLATERAL

答案 2 :(得分:0)

直到完成数据收集,引擎才知道表别名或列别名。您可以在同一查询的ORDER BY语句中使用它们,仅此而已。但是,您可以使用Common Table Expression也称为CTE

WITH myCTE AS (
SELECT 'X' AS AVC
 FROM sysibm.sysdummy1
)
SELECT *
  FROM myCTE
    WHERE AVC= 'X'

要做到这一点还有很长的路要走,但不幸的是。