oracle 如何在连接表中使用CONCAT函数的别名(已更新值)?

p1iqtdky  于 2023-05-16  发布在  Oracle
关注(0)|答案(2)|浏览(148)
SELECT
    CASE 
        WHEN data.DISPLAY_NAME LIKE '%xyz 850 G7%' 
            THEN CONCAT(data.DISPLAY_NAME, ' Notebook PC')
            ELSE data.DISPLAY_NAME
    END as u_display_name,
    data.ASSET_TAG AS "u_asset_tag", 
FROM
    VW_ALM_ASSET data
LEFT OUTER JOIN
    (SELECT 
         ASSET_TAG,
         CASE 
             WHEN data.u_display_name LIKE '%xyz%'
                 THEN SUBSTR(REPLACE(data.u_display_name, '(test) ', ''), 17)
     FROM 
         VW_ALM_ASSET
     WHERE
         data.u_display_name IS NOT NULL) data1 ON data1.ASSET_TAG = data.ASSET_TAG

我得到一个错误:
ORA-00904:“data.u_display_name”:无效标识符
00904. 00000 -“%s:无效标识符”

  • 原因:
  • 行动:
    行错误:46柱:12
    我想使用别名u_display_name,因为它正在使用CONCAT进行更新。我想在连接表中使用其更新的值来创建模型列,但它显示“无效标识符”错误。
    我尝试在连接表中使用data.u_display_nameu_display_name标识符。
    如何在连接表中使用u_display_name的当前更新值?
3j86kqsm

3j86kqsm1#

使用子查询和LATERAL连接:

SELECT data.asset_tag,
       data.u_display_name,
       data1.u_display_name2
FROM   (
         SELECT CASE 
                WHEN DISPLAY_NAME LIKE '%xyz 850 G7%' 
                THEN DISPLAY_NAME || ' Notebook PC'
                ELSE DISPLAY_NAME
                END as u_display_name,
                ASSET_TAG
         FROM   VW_ALM_ASSET
       ) data
       LEFT OUTER JOIN LATERAL(
         SELECT ASSET_TAG,
                CASE 
                WHEN data.u_display_name LIKE '%xyz%'
                THEN SUBSTR(REPLACE(data.u_display_name, '(test) '), 17)
                END AS u_display_name2
         FROM   VW_ALM_ASSET
         WHERE  data.u_display_name IS NOT NULL
         AND    ASSET_TAG = data.ASSET_TAG
       ) data1
       ON 1 = 1

但是,你可能不需要JOIN,因为你要将表连接到它本身,而可能需要一个嵌套的子查询:

SELECT u_display_name,
       asset_tag,
       CASE 
       WHEN u_display_name LIKE '%xyz%'
       THEN SUBSTR(REPLACE(u_display_name, '(test) '), 17)
       END AS u_display_name2
FROM   (
  SELECT CASE 
         WHEN DISPLAY_NAME LIKE '%xyz 850 G7%' 
         THEN DISPLAY_NAME || ' Notebook PC'
         ELSE DISPLAY_NAME
         END as u_display_name,
         ASSET_TAG
  FROM   VW_ALM_ASSET
)
-- WHERE  u_display_name IS NOT NULL
a14dhokn

a14dhokn2#

参见1.6在SQL Cookbook第2版的WHERE子句中引用别名列:

问题

您已经使用别名为结果集提供了更有意义的列名,并且希望使用WHERE子句排除某些行。但是,在WHERE子句中引用别名的尝试失败:

select sal as salary, comm as commission
  from emp
 where salary < 5000

解决方案

通过将查询 Package 为内联视图,可以引用带别名的列:

select *
  from (
select sal as salary, comm as commission
  from emp
       ) x
 where salary < 5000

相关问题