收到错误:"缺少关键字"在 where 子句中使用大小写


SELECT *
FROM corp_action_restriction car1
LEFT OUTER JOIN investment_account inv
ON CASE
WHEN REGEXP_LIKE(REGEXP_SUBSTR(car1.restriction_value,
'[^|]+',
1,
1),
'^[[:digit:]]*$') THEN
TO_NUMBER(REGEXP_SUBSTR(car1.restriction_value, '[^|]+', 1, 1)) =
inv.investment_account_id
ELSE
car1.restriction_value = TO_CHAR(inv.investment_account_id)
END

我得到丢失关键字错误。

有人能告诉我这个查询出了什么问题吗?

ORA-00905:缺少关键字
00905。00000-";缺少关键字">
*原因:
*措施:
行:4列:61 错误

因为return_exprelse_expr不能是布尔表达式类型。此外,REGEXP_SUBSTR()的第三和第四自变量(11(是冗余的。

实际上,您不需要CASE..WHEN表达式,如果DB版本是12cR2+,那么可以考虑使用

SELECT *
FROM corp_action_restriction car1
LEFT JOIN investment_account inv
ON TO_NUMBER(
REGEXP_SUBSTR(
car1.restriction_value, 
'[^|]+'
)  
DEFAULT NULL ON CONVERSION ERROR
) = inv.investment_account_id

这样,你就不会因为转换而出现错误

演示

那将是

SELECT *
FROM CORP_ACTION_RESTRICTION CAR1
LEFT OUTER JOIN INVESTMENT_ACCOUNT INV
ON INV.INVESTMENT_ACCOUNT_ID =
CASE
WHEN REGEXP_LIKE (REGEXP_SUBSTR (CAR1.RESTRICTION_VALUE,
'[^|]+',
1,
1),
'^[[:digit:]]*$')
THEN
TO_NUMBER (REGEXP_SUBSTR (CAR1.RESTRICTION_VALUE,
'[^|]+',
1,
1))
ELSE
CAR1.RESTRICTION_VALUE
END;

换句话说,将inv.investment_account_id放入ON子句中,然后将其(与=(与case表达式的结果进行比较。

最新更新