Oracle条件更新查询
我有一个要求,如下所示:Oracle条件更新查询,oracle,procedure,Oracle,Procedure,我有一个要求,如下所示: EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO -------------------------------------------------------------------------------- 7566 JONES 7839 04/02/1981 2975 - 20 7788 SCOTT MANAGER 75
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
--------------------------------------------------------------------------------
7566 JONES 7839 04/02/1981 2975 - 20
7788 SCOTT MANAGER 7566 12/09/1982 3000 - 20
7902 FORD MANAGER 7566 12/03/1981 3000 - 20
7369 SMITH 7902 12/17/1980 800 - 20
7876 ADAMS 7788 01/12/1983 1100 - 20
假设我们有5行的EMP表,deptno=20——这里我将从输入参数中获取deptno,即20
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
--------------------------------------------------------------------------------
7566 JONES MANAGER 7839 04/02/1981 2975 - 20
7788 SCOTT ANALYST 7566 12/09/1982 3000 - 20
7902 FORD ANALYST 7566 12/03/1981 3000 - 20
7369 SMITH CLERK 7902 12/17/1980 800 - 20
7876 ADAMS CLERK 7788 01/12/1983 1100 - 20
现在我想在更新EMP表的过程中编写一个更新查询
设置作业='MANAGER',其中empno位于(77887902);--此处empno,即7788和7902,我将从输入参数中获取
我的更新查询应该为deptno=20的两行更新JOB='MANAGER'
对于我要更新的其余3行,将使用空值
因此,最终输出将如下所示:
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
--------------------------------------------------------------------------------
7566 JONES 7839 04/02/1981 2975 - 20
7788 SCOTT MANAGER 7566 12/09/1982 3000 - 20
7902 FORD MANAGER 7566 12/03/1981 3000 - 20
7369 SMITH 7902 12/17/1980 800 - 20
7876 ADAMS 7788 01/12/1983 1100 - 20
那么,编写此查询的最佳方法是什么呢
UPDATE emp
SET job = (CASE empno
WHEN 7788
THEN 'MANAGER'
WHEN 7902
THEN 'MANAGER'
ELSE NULL
END)
WHERE deptno = 20;
或
希望这就是你想要的
编辑:在您对来自数字表的输入进行评论后,键入以下内容:
CREATE TYPE number_tab
AS TABLE OF NUMBER
/
创建的类型
为了清楚起见,我更愿意用两个update语句来解决这个问题
UPDATE emp SET job = null
WHERE deptno = 20
AND empno NOT IN (7788, 7902);
UPDATE emp SET job = 'MANAGER'
WHERE deptno = 20
AND empno IN (7788, 7902);
如果要将其放入一个更新中,您可以这样做:
UPDATE emp SET job = DECODE(empno, 7788, 'MANAGER', 7902, 'MANAGER', null)
WHERE deptno = 20;
Tom Kyte建议使用CASE over decode——“解码有点模糊——CASE非常清楚。解码中容易做的事情在CASE中也很容易做,解码中难以或几乎不可能做的事情在CASE中也很容易做。CASE,逻辑方面,轻而易举地获胜。”,
case
优于decode
,我同意这一点。然而,我的观点是,在某些情况下,除非考虑性能,否则这两种方法都是不可取的。特别是当您的SQL是由中间件应用程序生成的时候,更清楚的是通过两个单独的更新来实现这一点。我仍然更喜欢在一个更新中完成,更少的工作要做,更少的上下文切换,一个要维护的语句等。您说您将获得empno作为输入参数。您的输入参数遵循什么格式?是CSV列表吗?PL/SQL表?你们如何接受多个empno值?很抱歉,我忘了在示例中提到一件事,我正在以集合的形式获取输入参数。所以在这个场景中,我无法编写简单的case语句。因此,我必须使用一些循环,而不是直接使用case-when语句来产生问题。OK,您的输入参数是什么类型的集合?它的用户声明的数字表类型OK,请参阅我的答案的新编辑。你将不得不为你的确切场景而玩弄它,但它应该非常接近。
UPDATE emp SET job = DECODE(empno, 7788, 'MANAGER', 7902, 'MANAGER', null)
WHERE deptno = 20;