在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函数有使用限制?
根据您的描述和示例,问题可能出在
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
。你所描述的错误可能是由于
instr()
函数的使用方式不正确引起的。instr()
函数用于返回子串在字符串中首次出现的位置,如果不存在则返回0。对于你的例子,你需要确保
t.url
和sapi_endpoint
都是字符串类型,并且sapi_endpoint
是t.url
的一部分。另外,instr()
函数的第三个参数是你想开始搜索的位置,默认为1,表示从第一位开始搜索。以下是修复后的查询:
具体使用可参考:https://help.aliyun.com/zh/maxcompute/user-guide/instr?spm=a2c4g.11174283.0.i16
看这个异常提示,翻译成中文的意思是 语义分析异常:当使用非等值相关条件时,需要另外提供一个有效的等值条件。
在语义分析的时候程序不能确定 sapi_data和operation_sapilog_details如何去关联,需要一个等值的条件去确定关联关系,这和instr是没有关系的,你可以加上一个等值条件试试
是的,对于关联查询来说,在ODPS SQL中确实有一些限制。从您的描述来看,似乎是由于使用了instr函数导致的。在ODPS SQL中,如果使用非等值关联条件(如>、<、like、instr等),则需要提供一个有效的等值关联条件。
在这种情况下,您可以考虑改用其他方法来实现相同的功能。例如,您可以先将sapi_endpoint添加到operation_sapilog_details表中作为列,然后在外部查询中直接比较这两个列,这样就可以避免关联查询的限制。