在sql 里嵌套查询时,查询条件带有instr时报错[阿里云MaxCompute]

在sql 里嵌套查询时,查询条件带有instr时报错,
例子如下

select
(select sapi_no from sapi_data where instr(t.url,sapi_endpoint)>0) as num
from operation_sapilog_details t;

报错

FAILED: ODPS-0130071:[2,38] Semantic analysis exception – using non-equal correlated condition should require another valid equal condition

但是如果时如下sql ,则成功
select
(select count(*)from sapi_data where t.url=sapi_endpoint) as num
from operation_sapilog_details t;

是否instr函数有使用限制?

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
=====这是一个广告位,招租中,联系qq 78315851====
4 条回复 A 作者 M 管理员
  1. 根据您的描述和示例,问题可能出在instr函数的使用上。在ODPS中,当在子查询中使用instr函数时,可能会导致错误”FAILED: ODPS-0130071:[2,38] Semantic analysis exception – using non-equal correlated condition should require another valid equal condition”。

    这是因为ODPS要求在使用非等值关联条件(如instr)时,还需要提供一个有效的等值关联条件。在这种情况下,您可以尝试将查询改写为包含等值关联条件的形式,以避免此错误。

    虽然您提供的第二个示例没有使用instr函数,但它满足了ODPS的要求,因为它使用了等值关联条件t.url=sapi_endpoint

  2. 你所描述的错误可能是由于instr()函数的使用方式不正确引起的。instr()函数用于返回子串在字符串中首次出现的位置,如果不存在则返回0。

    对于你的例子,你需要确保t.urlsapi_endpoint都是字符串类型,并且sapi_endpointt.url的一部分。另外,instr()函数的第三个参数是你想开始搜索的位置,默认为1,表示从第一位开始搜索。

    以下是修复后的查询:

    SELECT (SELECT sapi_no FROM sapi_data WHERE INSTR(t.url, sapi_endpoint) > 0) AS num FROM operation_sapilog_details t;

    具体使用可参考:https://help.aliyun.com/zh/maxcompute/user-guide/instr?spm=a2c4g.11174283.0.i16

  3. 看这个异常提示,翻译成中文的意思是 语义分析异常:当使用非等值相关条件时,需要另外提供一个有效的等值条件。
    在语义分析的时候程序不能确定 sapi_data和operation_sapilog_details如何去关联,需要一个等值的条件去确定关联关系,这和instr是没有关系的,你可以加上一个等值条件试试

  4. 是的,对于关联查询来说,在ODPS SQL中确实有一些限制。从您的描述来看,似乎是由于使用了instr函数导致的。在ODPS SQL中,如果使用非等值关联条件(如>、<、like、instr等),则需要提供一个有效的等值关联条件。

    在这种情况下,您可以考虑改用其他方法来实现相同的功能。例如,您可以先将sapi_endpoint添加到operation_sapilog_details表中作为列,然后在外部查询中直接比较这两个列,这样就可以避免关联查询的限制。