【发布时间】:2019-06-26 16:41:17
【问题描述】:
我想使用强制转换过滤连接的结果。问题是原始字段的一部分不能转换为整数。如果在加入后应用过滤器,那将不是问题。这就是为什么我想知道是否有办法(可能是优化器提示或其他方式)在连接操作之后推送过滤器评估。
这是我为示例构建的查询。我希望它可以工作,但会因“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 上进行了尝试
非常感谢。
【问题讨论】:
标签: sql oracle oracle11g oracle18c