Oracle用一条语句实现存在该行数据时更新,不存在时新增。Orace中使用LEAD、LAG分析函数求某行数据的前后n行。

本文介绍了如何在Oracle数据库中使用一条SQL语句实现数据的更新或插入操作,以及利用LEAD和LAG分析函数获取某行数据的前后行信息。内容包括更新插入的逻辑和LEAD、LAG函数的基本语法及案例演示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一,如果表中有这条数据,那么就更新,如果没有那么就新增。

-- SQL%NOTFOUND 是一个布尔值。与最近的sql语句(update, insert, delete, select)会发生交互,当最近的一条sql语句没有涉及任何行(返回值为0)的时候,则返回true,否则返回false。
BEGIN
    UPDATE USER
    SET USER.PASSWORD = '123456' WHERE USER.USERNAME = 'admin' AND USER.SEX = '1';
    IF SQL%NOTFOUND THEN
        INSERT INTO USER(RECORDID, USERNAME, PASSWORD, SEX)
        VALUES (GET_UUID(), 'admin', '123456', '1');
    END IF;
END;

二,Orace中使用LEAD、LAG求某行数据的前后n行

1,语法

SELECT B.ID, LAG(B.NUM, 1, NULL) OVER (ORDER BY B.ORDER) FROM B;

SELECT B.ID, LEAD(B.NUM, 1, NULL) OVER (ORDER BY B.ORDER) FROM B;

​ 将查询的数据根据OVER()中指定的字段进行排序,得到排好序的结果集,然后再取出LAG、LEAD中指定字段的前n行,此处n=1,括号中第三个参数代表空值时返回什么。

2,案例

​ 现有一张员工表Employee:

SELECT * FORM EMPLOYEE ORDER BY EMP03;

image-20220722101945146

需求:在排好序的人员结果集中,要得到王来光该人的上一行与下一行数据,如果没有返回空值。

-- 将结果集排好序之后, 求王来光的上一行人员数据
SELECT *
FROM EMPLOYEE
WHERE EMP00 = (SELECT P
               FROM (SELECT EMP00,
                            LAG(EMP00, 1, NULL)
                                OVER (ORDER BY EMP03) AS P
                     FROM EMPLOYEE) C
               WHERE C.EMP00 = '42DA375D-568D-4C3B-BB9C-A559482FCBE2');

image-20220722102140759

-- 将结果集排好序之后, 求王来光的下一行人员数据
SELECT *
FROM EMPLOYEE
WHERE EMP00 = (SELECT P
               FROM (SELECT EMP00,
                            LEAD(EMP00, 1, NULL)
                                OVER (ORDER BY EMP03) AS P
                     FROM EMPLOYEE) C
               WHERE C.EMP00 = '42DA375D-568D-4C3B-BB9C-A559482FCBE2');

image-20220722102221596

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值