一,如果表中有这条数据,那么就更新,如果没有那么就新增。
-- 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;
需求:在排好序的人员结果集中,要得到王来光该人的上一行与下一行数据,如果没有返回空值。
-- 将结果集排好序之后, 求王来光的上一行人员数据
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');
-- 将结果集排好序之后, 求王来光的下一行人员数据
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');