在 where 子句中执行 Oracle 查询

Posted

技术标签:

【中文标题】在 where 子句中执行 Oracle 查询【英文标题】:Oracle query execution in where clause 【发布时间】:2011-03-03 09:14:14 【问题描述】:

我们正在尝试执行一个选择查询,该查询在 case 语句中使用列名,如果在 where 子句中使用相同的列名,它将进入无限循环。

例如

select empId,empName,
        (case when empDept in ('A','B','C') then empAge
              when empDept in ('E','F','G') then empExp 
              else 'Dept-Not found' end) 
        from employee  where empDept in ('A','B','C','D','E','F','G')

即使我们将 or 子句放在 where 子句而不是 in 中也没关系。

编辑:编辑查询

【问题讨论】:

SQL 不执行“无限循环”,那么这里到底发生了什么?您缺少 CASE 表达式的 END 关键字,这意味着 SQL 无法按原样工作。 即使 End 我也面临同样的问题 是什么让你觉得存在无限循环?你如何运行查询?员工表有多大? 可能有 10000 条左右的记录。在 Informix 中只需 6 秒执行相同的查询时,在 5 分钟到 10 分钟的意义上是无限的 从什么时候开始有 5 分钟或 10 分钟是“无限的”? CASE 有什么奇特的功能吗? 【参考方案1】:

显然还有其他事情正在发生。 WHERE 子句在 SELECT(列列表)子句之前计算,它不可能产生无限循环。

考虑 (10.2.0.1):

SQL> CREATE TABLE employee AS
  2  SELECT 1 empId, 'e1' empName, 1 empAge, 10 empExp, 'A' empDept FROM dual
  3  UNION ALL SELECT 2, 'e2', 2, 9, 'B' FROM dual
  4  UNION ALL SELECT 3, 'e3', 3, 8, 'C' FROM dual
  5  UNION ALL SELECT 4, 'e4', 4, 7, 'D' FROM dual
  6  UNION ALL SELECT 5, 'e5', 5, 6, 'E' FROM dual
  7  UNION ALL SELECT 6, 'e6', 6, 5, 'F' FROM dual;

Table created

SQL> select empId,empName,
  2          (case when empDept in ('A','B','C') then to_char(empAge)
  3                when empDept in ('E','F','G') then to_char(empExp)
  4                else 'Dept-Not found' end)
  5          from employee  where empDept in ('A','B','C','D','E','F','G');

     EMPID EMPNAME (CASEWHENEMPDEPTIN('A','B','C'
---------- ------- ----------------------------------------
         1 e1      1
         2 e2      2
         3 e3      3
         4 e4      Dept-Not found
         5 e5      6
         6 e6      5

正如您在我的示例中看到的,我必须在您的案例表达式中添加to_char,因为案例的所有结果都必须具有相同的类型。如果没有to_char,就我而言,我获得了 ORA-00932。当查询返回错误时,您的工具可能会挂起?

【讨论】:

【参考方案2】:

根据您提供的少量信息,作为一个非常疯狂的猜测,我会说如果没有 WHERE 子句,查询正在执行全表扫描,但是当您添加 WHERE 子句时,它会切换到索引范围扫描。如果您感兴趣的六个部门的记录分布在整个表中,那么索引范围扫描的效率很可能远低于表扫描。

造成这种情况的一个可能原因是表和索引上的统计信息已过时。

无论如何,诊断 SQL 性能问题的第一步应该是查看执行计划。

【讨论】:

以上是关于在 where 子句中执行 Oracle 查询的主要内容,如果未能解决你的问题,请参考以下文章

Oracle - where 子句中的案例

如何强制 where 子句中的函数在 oracle 中执行一次?

Oracle where exists 子句不适用于 SQL Plus

1. 安装Oracle,配置环境 2. 实现查询From子句 3. 实现查询where子句 4. 实现查询order by子句

在 Oracle 查询中将连接从 Where 子句移动到 From 子句

带有 WHERE 子句的 UNION