Oracle实战四大神器:CASE WHEN、EXISTS、WITH、MERGE 精简合集(HIS生产可用)
CSDN首发标签#Oracle #SQL优化 #MERGE #WITH子句 #EXISTS #CASEWHEN #数据库运维 #HIS系统 #存储过程 #数据同步 博文简介超实用Oracle生产级SQL干货一次性讲透开发/运维四大神器CASE WHEN、EXISTS、WITH、MERGE。搭配医院HIS真实业务场景、完整可运行代码、踩坑总结、存储过程封装、自动定时同步零基础也能直接上手面试生产双用️ 文章分类Oracle实战 / 数据库运维 / SQL性能优化 / 工作实战笔记简介精炼汇总 Oracle 运维与开发四大高频核心语法全部基于医院HIS真实业务场景涵盖语法讲解、实战踩坑、性能优化、存储过程生产落地。代码极简可直接复用适合生产开发、面试复习、CSDN收藏。适用场景患者数据查询、字段判空、报表统计、复杂SQL拆解、批量增量同步、定时数据归档兼容环境Oracle 11g / 12c / 19c 全版本通用一、CASE WHEN行级条件判断1. 核心作用逐行执行条件判断实现状态翻译、空值补全、字段映射相比 DECODE 支持多条件、范围判断灵活性更强是数据清洗、报表输出必备语法。2. 标准语法sqlCASEWHEN 条件1 THEN 结果1WHEN 条件2 THEN 结果2ELSE 默认结果END AS 字段别名3. HIS实战患者性别翻译 空值标记sqlSELECTd.brid,d.brxm,CASEWHEN d.brxb IS NULL THEN 性别未录入WHEN d.brxb 1 THEN 男WHEN d.brxb 2 THEN 女ELSE 未知END AS brxb_textFROM ms_brda dWHERE d.jdsj TRUNC(SYSDATE) - 7;4. 避坑要点条件从上至下匹配精准条件前置宽泛条件后置必须使用ELSE兜底防止查询出现空值异常仅用于前端展示、字段翻译复杂业务逻辑建议封装存储过程。二、EXISTS高效存在性判断优化神器1. 核心原理EXISTS 属于半连接查询匹配到第一条符合条件的数据立即终止扫描性能碾压 IN、COUNT(*)、LEFT JOIN 判空是大数据量判存最优方案。2. 经典踩坑全局判断 VS 行级判断这是 90% 开发者都会写错的点直接决定业务逻辑是否正确。❌ 错误写法全局判断所有行结果一致无业务意义sqlSELECTd.brid,d.brxm,CASEWHEN EXISTS(SELECT 1 FROM ms_brda c WHERE c.brxb IS NULL)THEN 有空性别ELSE 女END AS xbFROM ms_brda d;问题子查询未关联外层表仅判断「整张表是否存在空性别」所有行结果完全一致。✅ 正确写法行级关联核心精髓sqlSELECTd.brid,d.brxm,CASEWHEN EXISTS(SELECT 1FROM ms_brda cWHERE c.brid d.brid -- 关联外层主键实现单行独立判断AND c.brxb IS NULLAND ROWNUM 1 -- 性能优化匹配即停止扫描) THEN 有空性别ELSE TO_CHAR(d.brxb)END AS xbFROM ms_brda dWHERE d.mzhm 202212135547 OR d.jdsj TRUNC(SYSDATE) - 12;3. 高频实战NOT EXISTS 反向匹配查询近30天无缴费记录的患者替代低效左连接判空。sqlSELECT d.brid, d.brxmFROM ms_brda dWHERE NOT EXISTS(SELECT 1FROM pay_record prWHERE pr.patient_id d.bridAND pr.pay_date TRUNC(SYSDATE) - 30);4. 核心总结子查询统一写SELECT 1无需查询具体字段大数据量判存优先 EXISTS禁用 IN想要逐行独立判断必须关联外层主键。三、WITH CTE结构化拆解复杂SQL1. 核心优势WITH 可定义多个临时结果集彻底解决多层子查询嵌套混乱问题代码层级清晰、可读性拉满可直接作为 MERGE 数据源无需创建物理临时表。2. 实战多CTE链式统计处方数据sqlWITH-- 近7天处方数据recent_pres AS (SELECT pres_id, doctor_id, patient_id, pres_date, statusFROM prescriptionWHERE pres_date TRUNC(SYSDATE) - 7),-- 筛选未结算处方unpaid_pres AS (SELECT doctor_id, patient_idFROM recent_presWHERE status 未结算)-- 统计医生处方总量、未结算数量SELECTd.doctor_id,d.doctor_name,COUNT(r.pres_id) AS total_pres_count,COUNT(u.patient_id) AS unpaid_pres_countFROM doctor dLEFT JOIN recent_pres r ON d.doctor_id r.doctor_idLEFT JOIN unpaid_pres u ON d.doctor_id u.doctor_idGROUP BY d.doctor_id, d.doctor_name;3. 关键特性临时结果集仅当前SQL生效执行后自动销毁支持多段定义后段CTE可直接引用前段结果生产高频搭配 MERGE实现无物理临时表数据同步。四、MERGE INTO增改一体数据同步神器1. 核心价值单条SQL完成匹配更新、不匹配新增彻底抛弃「先查询判断、再UPDATE/INSERT」的繁琐逻辑是增量同步、日统计、数据修复的核心语法。2. 标准语法sqlMERGE INTO 目标表 tUSING 数据源 sON (唯一匹配条件)WHEN MATCHED THEN UPDATE SET 字段值WHEN NOT MATCHED THEN INSERT(字段列表) VALUES(对应值);3. 基础实战患者数据增量同步sqlMERGE INTO ms_brda dUSING temp_patient tON (d.brid t.brid)WHEN MATCHED THENUPDATE SETd.brxm t.brxm,d.brxb t.brxb,d.mzhm t.mzhm,d.last_update SYSDATEWHEN NOT MATCHED THENINSERT (brid, brxm, brxb, mzhm, jdsj, last_update)VALUES (t.brid, t.brxm, t.brxb, t.mzhm, t.jdsj, SYSDATE);4. 高阶王炸WITH MERGE 无临时表同步生产最优写法无需建表直接统计数据并同步至统计表。sqlMERGE INTO prescription_stat sUSING (WITH pres_data AS (SELECT doctor_id, pres_idFROM prescriptionWHERE pres_date TRUNC(SYSDATE) - 1)SELECT doctor_id, COUNT(pres_id) AS pres_numFROM pres_dataGROUP BY doctor_id) tON (s.doctor_id t.doctor_id AND s.stat_date TRUNC(SYSDATE))WHEN MATCHED THENUPDATE SET s.pres_num t.pres_num, s.update_time SYSDATEWHEN NOT MATCHED THENINSERT (doctor_id, pres_num, stat_date, update_time)VALUES (t.doctor_id, t.pres_num, TRUNC(SYSDATE), SYSDATE);5. 生产避坑ON 条件必须唯一否则抛出 ORA-30926 稳定行异常支持条件更新、联动 DELETE 清理脏数据语句具备原子性要么全部成功要么全部回滚。五、生产进阶存储过程封装 MERGE可直接上线生产环境定时同步、批量补数必须封装存储过程搭配事务、异常捕获、日志输出保证数据安全稳定。1. 标准生产存储过程plsqlCREATE OR REPLACE PROCEDURE P_SYNC_PATIENT_DATAISBEGINMERGE INTO ms_brda dUSING temp_patient tON (d.brid t.brid)WHEN MATCHED THENUPDATE SETd.brxm t.brxm,d.brxb t.brxb,d.mzhm t.mzhm,d.last_update SYSDATEWHEN NOT MATCHED THENINSERT (brid, brxm, brxb, mzhm, jdsj, last_update)VALUES (t.brid, t.brxm, t.brxb, t.mzhm, t.jdsj, SYSDATE);DBMS_OUTPUT.PUT_LINE(同步完成影响行数 || SQL%ROWCOUNT);COMMIT;EXCEPTIONWHEN OTHERS THENROLLBACK;DBMS_OUTPUT.PUT_LINE(同步失败 || SQLCODE || - || SQLERRM);END P_SYNC_PATIENT_DATA;/2. 动态入参版按天数增量同步plsqlCREATE OR REPLACE PROCEDURE P_SYNC_PATIENT_BY_DAY(IN_DAY IN NUMBER)ISBEGINMERGE INTO ms_brda dUSING (SELECT brid, brxm, brxb, mzhm, jdsjFROM temp_patientWHERE create_time SYSDATE - IN_DAY) tON (d.brid t.brid)WHEN MATCHED THENUPDATE SET d.brxm t.brxm, d.brxb t.brxb, d.last_update SYSDATEWHEN NOT MATCHED THENINSERT (brid, brxm, brxb, mzhm, jdsj, last_update)VALUES (t.brid, t.brxm, t.brxb, t.mzhm, t.jdsj, SYSDATE);DBMS_OUTPUT.PUT_LINE(同步||IN_DAY||天数据行数||SQL%ROWCOUNT);COMMIT;EXCEPTIONWHEN OTHERS THENROLLBACK;DBMS_OUTPUT.PUT_LINE(异常||SQLERRM);END P_SYNC_PATIENT_BY_DAY;/3. 全功能版条件更新 自动清理脏数据plsqlCREATE OR REPLACE PROCEDURE P_SYNC_PATIENT_FULLISBEGINMERGE INTO ms_brda dUSING temp_patient tON (d.brid t.brid)WHEN MATCHED THENUPDATE SET d.brxb t.brxb, d.last_update SYSDATEWHERE d.brxb IS NULL -- 仅修复空性别异常数据DELETE WHERE d.is_valid 0-- 自动清理作废脏数据WHEN NOT MATCHED THENINSERT (brid, brxm, brxb, mzhm, is_valid, last_update)VALUES (t.brid, t.brxm, t.brxb, t.mzhm, 1, SYSDATE);COMMIT;EXCEPTIONWHEN OTHERS THENROLLBACK;DBMS_OUTPUT.PUT_LINE(执行失败||SQLERRM);END P_SYNC_PATIENT_FULL;/4. 自动化落地JOB定时任务配置每日凌晨自动执行实现无人值守数据同步。plsql-- 每日00:30自动执行患者数据同步BEGINDBMS_JOB.SUBMIT(JOB 1,WHAT P_SYNC_PATIENT_DATA;,NEXT_DATE TO_DATE(2026-07-01 00:30:00,YYYY-MM-DD HH24:MI:SS),INTERVAL TRUNC(SYSDATE1) 30/1440);COMMIT;END;/六、核心语法速查表面试生产常备语法核心用途生产关键要点CASE WHEN行级状态翻译、字段判空从上至下匹配必须ELSE兜底防空值EXISTS高效数据存在性判断行级需关联主键性能完胜IN/COUNTWITH拆解复杂SQL、生成临时数据源无物理表可直接对接MERGE做同步MERGE批量增量增改数据同步唯一条件匹配、原子执行、支持定时调度七、全文总结本文汇总的四大 Oracle 语法是从普通SQL编写进阶到生产运维开发的核心分水岭。全覆盖数据查询、性能优化、报表统计、增量同步、自动化运维五大场景。所有案例基于医院HIS真实业务编写代码规范精简、无冗余可直接修改字段落地生产兼顾日常工作使用与面试复盘是一套高实用性的Oracle实战常备手册。

相关新闻

《Claude Code 工程化实战》第 7 讲 可写型子代理实战

《Claude Code 工程化实战》第 7 讲 可写型子代理实战

📌 本讲摘要 本讲是 SubAgent 系列的第 3 个实战、聚焦可写型子代理——Claude Code 工程化里权限最高的子代理类型。前 3 讲(只读 / 可执行 / 子代理链)都不会改变状态;可写是第一个"会改变状态"的类别、一旦写错就回不…

2026/7/2 9:24:36阅读更多 →
盘锦车衣车膜手工裁剪,边角更要细看

盘锦车衣车膜手工裁剪,边角更要细看

很多盘锦车主给新车贴车衣、车膜时,最先问的是膜材和价格,但真正影响后期使用感受的,往往是施工细节。尤其是选择手工裁剪时,边角位置、收边方式、刀口控制、贴合处理都要认真看。 如果正在对比盘锦车衣车膜,建议不要只…

2026/7/2 9:24:36阅读更多 →
一键智能激活:KMS_VL_ALL_AIO让你的Windows和Office永久激活无忧

一键智能激活:KMS_VL_ALL_AIO让你的Windows和Office永久激活无忧

一键智能激活:KMS_VL_ALL_AIO让你的Windows和Office永久激活无忧 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows和Office的激活问题烦恼吗?KMS_VL_ALL_AIO…

2026/7/2 9:24:36阅读更多 →
2. 应用编程---获取系统信息与系统资源

2. 应用编程---获取系统信息与系统资源

获取系统信息与系统资源1. 获取系统信息---uname() / sysinfo() / gethostname() / sysconf()1.1 proc文件系统2. 获取系统时间---time() / gettimeofday() / ctime() / ctime_r() / localtime() / localtime_r() / gmtime() / gmtime_r() / mktime() / asctime() / asctime_r(…

2026/7/2 10:45:01阅读更多 →
AI伦理落地七步法:从需求文档到上线监控的工程化实践

AI伦理落地七步法:从需求文档到上线监控的工程化实践

1. 项目概述:这不是一场技术秀,而是一次责任重构“Building a Brighter Future with AI: The Benefits of Ethical AI for Business and Society”——这个标题乍看像一份企业ESG报告的副标题,或是某场峰会的宣传横幅。但在我过去十年深度参与…

2026/7/2 10:45:01阅读更多 →
抖音背景音乐免费提取:3步掌握开源下载器的完整指南

抖音背景音乐免费提取:3步掌握开源下载器的完整指南

抖音背景音乐免费提取:3步掌握开源下载器的完整指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support…

2026/7/2 10:45:01阅读更多 →
抖音下载神器:5分钟学会批量下载视频、音乐和直播

抖音下载神器:5分钟学会批量下载视频、音乐和直播

抖音下载神器:5分钟学会批量下载视频、音乐和直播 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. …

2026/7/2 10:45:01阅读更多 →
2026年劳动法新规来了:电子劳动合同必须注意的五大合规要点

2026年劳动法新规来了:电子劳动合同必须注意的五大合规要点

2026年劳动法新规来了:电子劳动合同必须注意的五大合规要点 近日,随着2026年劳动法实施条例相关政策的逐步落地,企业用工管理正面临新一轮的合规审视。其中,电子劳动合同的规范化要求尤为引人关注。从人社部2020年明确电子劳动合同…

2026/7/2 10:45:01阅读更多 →
STM32与LTC6904的精确方波生成系统设计

STM32与LTC6904的精确方波生成系统设计

1. LTC6904与STM32F429NI的硬件协同设计精确方波脉冲生成系统的核心在于主控芯片与时钟发生器的完美配合。STM32F429NI作为ARM Cortex-M4内核的32位微控制器,其168MHz的主频和丰富的外设接口为系统提供了强大的处理能力。而LTC6904这款低功耗、高精度可编程振荡器&a…

2026/7/2 10:40:01阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/7/1 4:42:14阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

2026/7/1 5:19:01阅读更多 →
塞尔达传说旷野之息存档修改器:3分钟掌握海拉鲁世界自由定制技巧

塞尔达传说旷野之息存档修改器:3分钟掌握海拉鲁世界自由定制技巧

塞尔达传说旷野之息存档修改器:3分钟掌握海拉鲁世界自由定制技巧 【免费下载链接】BOTW-Save-Editor-GUI A Work in Progress Save Editor for BOTW 项目地址: https://gitcode.com/gh_mirrors/bo/BOTW-Save-Editor-GUI 想在《塞尔达传说:旷野之息…

2026/7/2 0:03:01阅读更多 →
告别 AccessKey:多云平台 CLI OAuth 免密认证完全指南

告别 AccessKey:多云平台 CLI OAuth 免密认证完全指南

在本地开发环境使用云厂商 CLI 时,传统的 AccessKey(AK)方式需要手动创建、下载和保管密钥,不仅繁琐,还存在泄漏风险。其实,主流云平台都已提供基于 OAuth 2.0 的免密认证方案,让开发者可以通过浏览器登录一次性完成授权,CLI 自动管理临时凭证的刷新,兼顾了便利与安全…

2026/7/2 0:03:01阅读更多 →
基于13DOF传感器与PIC32MZ的高精度嵌入式导航系统设计

基于13DOF传感器与PIC32MZ的高精度嵌入式导航系统设计

1. 项目背景与核心价值在嵌入式系统开发领域,高精度定位与导航一直是极具挑战性的技术方向。传统方案往往面临成本、精度和实时性难以兼顾的困境。这个项目通过13DOF(13自由度)传感器组合与PIC32MZ2048EFH100高性能MCU的协同工作,…

2026/7/2 0:03:01阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/2 0:33:58阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/2 1:32:11阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/2 1:50:13阅读更多 →