我想使用强制转换过滤连接的结果。问题是原始字段的一部分不能转换为整数。如果在加入后应用过滤器,那将不是问题。这就是为什么我想知道是否有办法(可能是优化器提示或其他东西)在连接操作之后推送过滤器评估。
这是我为示例构建的查询。我希望它能够工作,但会因“ORA-01722 无效号码”而失败:
WITH "literal" AS (
SELECT 1 AS "literal_id", 'abc' AS "literal"
FROM "DUAL"
UNION
SELECT 2 AS "literal_id", '7' AS "literal"
FROM "DUAL"
),
"scalar" AS (
SELECT 3 AS "scalar_id", 2 AS "literal_id"
FROM "DUAL"
CONNECT BY ROWNUM <= 10000
)
SELECT *
FROM "scalar"
JOIN "literal" USING ("literal_id")
WHERE TO_NUMBER("literal") > 6;
ORA-01722 被抛出是因为它应用于“文字”CTE,因此崩溃,因为 'abc' 显然不是数字。我们可以在执行计划中看到这一点:
为了减少导致我的问题的可能性,我执行了该查询:
CREATE TABLE "literal" AS (
SELECT 1 AS "literal_id", 'abc' AS "literal"
FROM "DUAL"
UNION
SELECT 2 AS "literal_id", '7' AS "literal"
FROM "DUAL"
);
CREATE TABLE "scalar" AS (
SELECT 3 AS "scalar_id", 2 AS "literal_id"
FROM "DUAL"
CONNECT BY ROWNUM <= 10000
);
CREATE TABLE "joined" AS (
SELECT *
FROM "scalar"
JOIN "literal" USING ("literal_id")
);
SELECT *
FROM "joined"
WHERE TO_NUMBER("literal") > 6;
效果很好。
那么,有没有办法重写这个查询(虽然我仍然需要这是一个单一的查询)所以它不会尝试转换 'abc' ?
作为参考,我在 Oracle Database 18c Standard Edition 2 Release 18.0.0.0.0 以及 Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 上进行了尝试
非常感谢。