【问题标题】:ALIAS in where clause not workingwhere 子句中的别名不起作用
【发布时间】:2015-02-02 14:52:37
【问题描述】:

我有由大字符串组成的列RESPONSE_XML and REQUEST_XML。我对这个大字符串使用了 substring 函数,以便从 RESPONSE_XML 中获取 SUBSCRIPTION_ID 并从 REQUEST_XML 中获取 orderType。查询工作正常。但现在我想为这个查询设置条件,使其只返回 orderType='NEW' 的 SUBSCRIPTION_ID。我将两个子字符串的结果存储到别名中,并在 where 条件下使用这些别名。但它不起作用并给出错误ORA-01722 Invalid numnber。这是我的查询:

    SELECT REPLACE(REPLACE(REGEXP_SUBSTR(RESPONSE_XML, '<ax2147:subscriptions xsi:type="ax2127:SubscriptionDTO"><ax2130:id>\d+</ax2130:id>'), 
    '<ax2147:subscriptions xsi:type="ax2127:SubscriptionDTO"><ax2130:id>', ''), '</ax2130:id>', '') 
    AS SUBSCRIPTION_ID , 
    REPLACE(REPLACE(REGEXP_SUBSTR(REQUEST_XML, '<ns7:orderType>\d+</ns7:orderType>'), '<ns7:orderType>', ''), '</ns7:orderType>', '') 
    AS order_type
    FROM
    SOAP_MONITORING 
    where WEB_SERVICE_NAME='RatorWebShopService' and WEB_METHOD_NAME='placeShopOrder' 
and order_type='NEW' order by CREATE_DATE desc

我也尝试过以这种方式查询,但结果是错误,即第 10 行的 ORA-00932 数据类型不一致

SELECT REPLACE(REPLACE(REGEXP_SUBSTR(RESPONSE_XML, '<ax2147:subscriptions xsi:type="ax2127:SubscriptionDTO"><ax2130:id>\d+</ax2130:id>'), 
'<ax2147:subscriptions xsi:type="ax2127:SubscriptionDTO"><ax2130:id>', ''), '</ax2130:id>', '') 
AS SUBSCRIPTION_ID from SOAP_MONITORING 
where 
REQUEST_XML
in
(
REPLACE(REPLACE(REGEXP_SUBSTR(REQUEST_XML, '<ns7:orderType>\d+</ns7:orderType>'), '<ns7:orderType>', ''), '</ns7:orderType>', '') 
)
and WEB_SERVICE_NAME='RatorWebShopService' and WEB_METHOD_NAME='placeShopOrder' and REQUEST_XML='NEW'

【问题讨论】:

  • 您不能在where 子句中使用alases。使用子查询或 CTE。
  • 因为在定义列别名之前定义(逻辑执行)结果集行。
  • 哦,好的,我将尝试使用 nusing 子查询运行查询。
  • 请检查我写的另一个查询但结果错误的问题

标签: sql oracle substring alias where-clause


【解决方案1】:

为了对列别名做谓词(WHERE),您可以使用内联视图(也称为子查询,虽然子查询实际上更普遍地用于不同的事情)或common表表达式(也称为 CTE 或“with”子句)。

内联视图你可以这样做:

select iw.order_type
from (
   SELECT REPLACE(REPLACE(REGEXP_SUBSTR(RESPONSE_XML, '<ax2147:subscriptions xsi:type="ax2127:SubscriptionDTO"><ax2130:id>\d+</ax2130:id>'), 
   '<ax2147:subscriptions xsi:type="ax2127:SubscriptionDTO"><ax2130:id>', ''), '</ax2130:id>', '') 
   AS SUBSCRIPTION_ID , 
   REPLACE(REPLACE(REGEXP_SUBSTR(REQUEST_XML, '<ns7:orderType>\d+</ns7:orderType>'), '<ns7:orderType>', ''), '</ns7:orderType>', '') 
   AS order_type,
   CREATE_DATE
   FROM
   SOAP_MONITORING 
   where WEB_SERVICE_NAME='RatorWebShopService' and WEB_METHOD_NAME='placeShopOrder' 
) iw
where iw.order_type='NEW'
order by iw.CREATE_DATE desc

常见的表表达式你可以这样做:

with cte as (
   SELECT REPLACE(REPLACE(REGEXP_SUBSTR(RESPONSE_XML, '<ax2147:subscriptions xsi:type="ax2127:SubscriptionDTO"><ax2130:id>\d+</ax2130:id>'), 
   '<ax2147:subscriptions xsi:type="ax2127:SubscriptionDTO"><ax2130:id>', ''), '</ax2130:id>', '') 
   AS SUBSCRIPTION_ID , 
   REPLACE(REPLACE(REGEXP_SUBSTR(REQUEST_XML, '<ns7:orderType>\d+</ns7:orderType>'), '<ns7:orderType>', ''), '</ns7:orderType>', '') 
   AS order_type,
   CREATE_DATE
   FROM
   SOAP_MONITORING 
   where WEB_SERVICE_NAME='RatorWebShopService' and WEB_METHOD_NAME='placeShopOrder' 
)
select cte.order_type
from cte
where cte.order_type='NEW'
order by cte.CREATE_DATE desc

【讨论】:

  • 您好,Kim 感谢您的回复。我想我们快到了。我尝试了您的第一个查询,它在 WHERE cte.order_type='NEW' ORA-00932: 不一致的数据类型:预期 - 得到 CLOB 行给出了上述错误。我们要从中提取结果的 REQUEST_XML 列是 CLOB 数据类型
  • 这与列别名没有任何关系,而是cte.order_type='new' 比较了两种不同的数据类型。您可以在内联视图中使用 substr 或强制转换来使您的 CLOB 成为 VARCHAR2。如果您无法做到这一点,我建议您提出一个新问题,因为将其与有关列别名谓词的问题混为一谈会令人困惑。
  • 话虽如此,我还建议您阅读 Oracle 数据库(XMLExtract、XMLTable、XMLExists 等)中的 XML 功能,而不是使用正则表达式解析 XML。根据表中的数据量,您可能需要在 REQUEST_XML 列上使用 XMLIndex 才能使其正常运行。
  • Hello Kim 我以前使用 XMLEXTRACT 从 xml 中提取值,但我在使用数据库链接时遇到了一些问题。如果您能在回答中说明如何将 CLOB 转换为 VARCHAR,那将非常有帮助。根据 stackoverflow 的规则,我必须等待 1 小时才能提出另一个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-27
  • 2014-01-26
  • 1970-01-01
  • 1970-01-01
  • 2010-09-26
  • 2016-11-13
  • 1970-01-01
相关资源
最近更新 更多