因为
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_expr
或else_expr
不能是布尔表达式类型。此外,REGEXP_SUBSTR()
的第三和第四自变量(1
和1
(是冗余的。
实际上,您不需要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表达式的结果进行比较。