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

-- 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

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐