当前位置: 首页 > news >正文

制造业、质检类20种业务场景,SQL精写技巧

在制造业、质检类业务场景中,经常需要基于上限(USL)、下限(LSL)字段整合标准值,或通过实测值(如PH、温度等)判断是否超出上下限。本文结合实际业务需求,整理了20种Oracle SQL高效写法,覆盖字段整合、超限判断、空值处理、性能优化等核心场景,兼顾精简性与执行效率。

一、业务背景说明

核心字段定义:

  • USL:上限值(可为空,如PH上限30)
  • LSL:下限值(可为空,如PH下限20)
  • ACT_VALUE:实测值(如实测PH值)

核心业务规则:

  1. 标准值整合:仅USL有值显示<=USL,仅LSL有值显示>=LSL,两者有值显示LSL-USL,全空显示空/默认值;
  2. 超限判断:实测值超过USL(USL非空)或低于LSL(LSL非空)则标记为1(超限),否则为0(正常)。

二、20种高效写法全解析

场景1:CASE表达式基础版(标准值整合)

场景:基础场景,优先保证可读性
SQL写法

SELECTCASEWHENUSLISNOTNULLANDLSLISNOTNULLTHENLSL||'-'||USLWHENUSLISNOTNULLTHEN'<='||USLWHENLSLISNOTNULLTHEN'>='||LSLELSENULLENDASSTANDARD_VALUE,USL,LSLFROMQC_TABLE;

解析:按“双值→仅上限→仅下限→全空”优先级判断,逻辑清晰,Oracle原生优化,无性能损耗。

场景2:NVL2嵌套精简版(标准值整合)

场景:追求代码精简,一行完成逻辑
SQL写法

SELECTNVL2(USL,NVL2(LSL,LSL||'-'||USL,'<='||USL),NVL2(LSL,'>='||LSL,NULL))ASSTANDARD_VALUE,USL,LSLFROMQC_TABLE;

解析:利用NVL2(字段, 非空返回值, 空返回值)嵌套,替代CASE表达式,代码量减少50%,执行效率一致。

场景3:DECODE+NVL组合版(标准值整合)

场景:兼容全空场景,自定义默认值
SQL写法

SELECTDECODE(SIGN(NVL(LENGTH(USL),0)+NVL(LENGTH(LSL),0)),0,'无标准值',1,DECODE(USL,NULL,'>='||LSL,'<='||USL),2,LSL||'-'||USL)ASSTANDARD_VALUE,USL,LSLFROMQC_TABLE;

解析:通过LENGTH判断非空,SIGN统计非空字段数,DECODE按数量分支,全空时返回“无标准值”。

场景4:CASE基础版(超限判断)

场景:新手友好,超限判断基础写法
SQL写法

SELECTCASEWHEN(USLISNOTNULLANDACT_VALUE>USL)OR(LSLISNOTNULLANDACT_VALUE<LSL)THEN1ELSE0ENDASIS_OUT_RANGE,ACT_VALUE,USL,LSLFROMQC_TABLE;

解析:显式判断空值后对比,避免空值参与运算,可读性拉满,适合团队协作场景。

场景5:DECODE+SIGN修复版(超限判断)

场景:精简超限判断,解决“缺少括号”报错
SQL写法

SELECTDECODE(SIGN(CASEWHENUSLISNOTNULLANDACT_VALUE>USLTHEN1ELSE0END+CASEWHENLSLISNOTNULLANDACT_VALUE<LSLTHEN1ELSE0END),0,0,1)ASIS_OUT_RANGE,ACT_VALUE,USL,LSLFROMQC_TABLE;

解析:用CASE显式转换布尔判断为数值,避免Oracle解析器报错,一行完成超限判断。

场景6:空值兼容版(标准值整合)

场景:处理字段为空格/空字符串的情况
SQL写法

SELECTCASEWHENTRIM(USL)ISNOTNULLANDTRIM(LSL)ISNOTNULLTHENTRIM(LSL)||'-'||TRIM(USL)WHENTRIM(USL)ISNOTNULLTHEN'<='||TRIM(USL)WHENTRIM(LSL)ISNOTNULLTHEN'>='||TRIM(LSL)ELSE'无标准'ENDASSTANDARD_VALUE,USL,LSLFROMQC_TABLE;

解析:通过TRIM过滤空格,兼容业务中“空字符串”而非NULL的场景。

场景7:数值格式化版(标准值整合)

场景:USL/LSL为数值类型,需格式化显示(如保留1位小数)
SQL写法

SELECTCASEWHENUSLISNOTNULLANDLSLISNOTNULLTHENTO_CHAR(LSL,'999.9')||'-'||TO_CHAR(USL,'999.9')WHENUSLISNOTNULLTHEN'<='||TO_CHAR(USL,'999.9')WHENLSLISNOTNULLTHEN'>='||TO_CHAR(LSL,'999.9')ELSENULLENDASSTANDARD_VALUE,USL,LSLFROMQC_TABLE;

解析:用TO_CHAR格式化数值,避免科学计数法,符合业务展示规范。

场景8:多条件短路版(超限判断)

场景:大数据量场景,利用短路逻辑提升效率
SQL写法

SELECTCASEWHENUSLISNOTNULLANDACT_VALUE>USLTHEN1WHENLSLISNOTNULLANDACT_VALUE<LSLTHEN1ELSE0ENDASIS_OUT_RANGE,ACT_VALUE,USL,LSLFROMQC_TABLE;

解析:优先判断“超上限”,满足则直接返回1,无需判断下限,减少逻辑运算次数。

场景9:COALESCE简化版(标准值整合)

场景:简化空值判断,兼容多字段默认值
SQL写法

SELECTCOALESCE(CASEWHENUSLISNOTNULLANDLSLISNOTNULLTHENLSL||'-'||USLEND,CASEWHENUSLISNOTNULLTHEN'<='||USLEND,CASEWHENLSLISNOTNULLTHEN'>='||LSLEND,'未定义')ASSTANDARD_VALUE,USL,LSLFROMQC_TABLE;

解析COALESCE按顺序取第一个非空值,简化多层CASE嵌套。

场景10:CASE嵌套版(复杂标准值)

场景:新增规则——USL/LSL相等时显示“等于X”
SQL写法

SELECTCASEWHENUSLISNOTNULLANDLSLISNOTNULLTHENCASEWHENUSL=LSLTHEN'='||USLELSELSL||'-'||USLENDWHENUSLISNOTNULLTHEN'<='||USLWHENLSLISNOTNULLTHEN'>='||LSLELSENULLENDASSTANDARD_VALUE,USL,LSLFROMQC_TABLE;

解析:嵌套CASE处理特殊规则,逻辑分层清晰,不影响主流程效率。

场景11:函数封装版(复用逻辑)

场景:多报表/查询复用标准值整合逻辑
SQL写法

-- 创建自定义函数CREATEORREPLACEFUNCTIONGET_STANDARD_VALUE(v_usl NUMBER,v_lsl NUMBER)RETURNVARCHAR2DETERMINISTIC-- 确定性函数,提升缓存效率ISBEGINIFv_uslISNOTNULLANDv_lslISNOTNULLTHENRETURNv_lsl||'-'||v_usl;ELSIF v_uslISNOTNULLTHENRETURN'<='||v_usl;ELSIF v_lslISNOTNULLTHENRETURN'>='||v_lsl;ELSERETURNNULL;ENDIF;END;/-- 调用函数SELECTGET_STANDARD_VALUE(USL,LSL)ASSTANDARD_VALUE,USL,LSLFROMQC_TABLE;

解析:封装为确定性函数,重复调用时Oracle会缓存结果,提升大数据量查询效率。

场景12:批量判断版(多字段超限)

场景:同时判断PH、温度两个指标的超限状态
SQL写法

SELECT-- PH超限CASEWHEN(PH_USLISNOTNULLANDPH_VALUE>PH_USL)OR(PH_LSLISNOTNULLANDPH_VALUE<PH_LSL)THEN1ELSE0ENDASPH_OUT_RANGE,-- 温度超限CASEWHEN(TEMP_USLISNOTNULLANDTEMP_VALUE>TEMP_USL)OR(TEMP_LSLISNOTNULLANDTEMP_VALUE<TEMP_LSL)THEN1ELSE0ENDASTEMP_OUT_RANGE,PH_VALUE,TEMP_VALUE,PH_USL,PH_LSL,TEMP_USL,TEMP_LSLFROMQC_TABLE;

解析:批量处理多字段,复用核心判断逻辑,避免重复代码。

场景13:范围包含版(反向判断)

场景:判断实测值是否在标准范围内(返回1=正常,0=超限)
SQL写法

SELECTCASEWHEN(USLISNULLORACT_VALUE<=USL)AND(LSLISNULLORACT_VALUE>=LSL)THEN1ELSE0ENDASIS_IN_RANGE,ACT_VALUE,USL,LSLFROMQC_TABLE;

解析:反向逻辑,优先判断“在范围内”,适合“正常值标记”场景。

场景14:空值替换版(标准值整合)

场景:全空时显示“无标准”,而非NULL
SQL写法

SELECTNVL(NVL2(USL,NVL2(LSL,LSL||'-'||USL,'<='||USL),NVL2(LSL,'>='||LSL,NULL)),'无标准')ASSTANDARD_VALUE,USL,LSLFROMQC_TABLE;

解析NVL外层包裹,统一处理全空场景,代码精简且逻辑清晰。

场景15:算术运算版(超限判断)

场景:用数值运算替代布尔判断,提升执行效率
SQL写法

SELECTROUND(LEAST(NVL(SIGN(ACT_VALUE-USL),0),0)+GREATEST(NVL(SIGN(LSL-ACT_VALUE),0),0))ASIS_OUT_RANGE,ACT_VALUE,USL,LSLFROMQC_TABLE;

解析

  • SIGN(ACT_VALUE - USL):>0表示超上限,≤0表示正常;
  • SIGN(LSL - ACT_VALUE):>0表示低于下限,≤0表示正常;
  • 结合LEAST/GREATEST过滤无效值,最终结果1=超限,0=正常。

场景16:正则校验版(标准值格式校验)

场景:整合标准值后,校验格式是否符合“X-Y”/“<=X”/“>=X”
SQL写法

SELECTSTANDARD_VALUE,CASEWHENSTANDARD_VALUE REGEXP_LIKE('^(<=[0-9.]+)|(>=[0-9.]+)|([0-9.]+-[0-9.]+)$')THEN'格式正确'ELSE'格式错误'ENDASFORMAT_CHECKFROM(-- 子查询整合标准值SELECTNVL2(USL,NVL2(LSL,LSL||'-'||USL,'<='||USL),NVL2(LSL,'>='||LSL,NULL))ASSTANDARD_VALUE,USL,LSLFROMQC_TABLE);

解析:用REGEXP_LIKE正则校验,确保标准值格式符合业务规范。

场景17:性能优化版(加索引后查询)

场景:大数据量表(千万级),需提升查询效率
SQL写法

-- 1. 创建复合索引(针对查询条件+核心字段)CREATEINDEXIDX_QC_USL_LSL_ACTONQC_TABLE(USL,LSL,ACT_VALUE);-- 2. 高效查询(避免全表扫描)SELECT/*+ INDEX(QC_TABLE IDX_QC_USL_LSL_ACT) */CASEWHEN(USLISNOTNULLANDACT_VALUE>USL)OR(LSLISNOTNULLANDACT_VALUE<LSL)THEN1ELSE0ENDASIS_OUT_RANGE,ACT_VALUE,USL,LSLFROMQC_TABLEWHEREUSLISNOTNULLORLSLISNOTNULL;-- 过滤全空数据,减少运算

解析

  • 创建复合索引覆盖查询字段,避免回表;
  • /*+ INDEX */提示强制走索引;
  • 提前过滤全空数据,减少CASE运算次数。

场景18:多表关联版(关联查询整合标准)

场景:从标准表关联实测表,整合标准值
SQL写法

SELECTt1.ACT_VALUE,CASEWHENt2.USLISNOTNULLANDt2.LSLISNOTNULLTHENt2.LSL||'-'||t2.USLWHENt2.USLISNOTNULLTHEN'<='||t2.USLWHENt2.LSLISNOTNULLTHEN'>='||t2.LSLELSE'无标准'ENDASSTANDARD_VALUE,CASEWHEN(t2.USLISNOTNULLANDt1.ACT_VALUE>t2.USL)OR(t2.LSLISNOTNULLANDt1.ACT_VALUE<t2.LSL)THEN1ELSE0ENDASIS_OUT_RANGEFROMQC_ACTUAL t1LEFTJOINQC_STANDARD t2ONt1.ITEM_ID=t2.ITEM_ID;-- 按物料/指标关联

解析:左关联保证实测数据不丢失,关联后复用核心判断逻辑。

场景19:分组统计版(按超限状态统计)

场景:统计各批次的超限/正常数量
SQL写法

SELECTBATCH_NO,COUNT(CASEWHENIS_OUT_RANGE=1THEN1END)ASOUT_RANGE_COUNT,COUNT(CASEWHENIS_OUT_RANGE=0THEN1END)ASNORMAL_COUNT,COUNT(*)ASTOTAL_COUNTFROM(-- 子查询标记超限状态SELECTBATCH_NO,DECODE(SIGN(CASEWHENUSLISNOTNULLANDACT_VALUE>USLTHEN1ELSE0END+CASEWHENLSLISNOTNULLANDACT_VALUE<LSLTHEN1ELSE0END),0,0,1)ASIS_OUT_RANGEFROMQC_TABLE)GROUPBYBATCH_NOORDERBYBATCH_NO;

解析:子查询标记状态,外层分组统计,避免重复判断逻辑,提升统计效率。

场景20:动态SQL版(PL/SQL批量处理)

场景:PL/SQL中动态生成判断逻辑,适配不同指标
SQL写法

DECLAREv_sql VARCHAR2(2000);v_index VARCHAR2(10):='PH';-- 可动态切换指标:PH/TEMP等BEGIN-- 动态拼接SQL,适配不同指标字段v_sql :=' SELECT '||v_index||'_VALUE AS ACT_VALUE, CASE WHEN ('||v_index||'_USL IS NOT NULL AND '||v_index||'_VALUE > '||v_index||'_USL) OR ('||v_index||'_LSL IS NOT NULL AND '||v_index||'_VALUE < '||v_index||'_LSL) THEN 1 ELSE 0 END AS IS_OUT_RANGE FROM QC_TABLE WHERE '||v_index||'_VALUE IS NOT NULL';-- 执行动态SQL(示例:输出到控制台)FORrecINEXECUTEIMMEDIATE v_sqlLOOPDBMS_OUTPUT.PUT_LINE('实测值:'||rec.ACT_VALUE||',超限状态:'||rec.IS_OUT_RANGE);ENDLOOP;END;/

解析:动态拼接字段名,适配多指标批量处理场景,减少重复代码。

三、核心优化原则总结

  1. 优先使用原生函数NVL2/DECODE/SIGN等Oracle原生函数比多层CASE嵌套更精简,且执行效率更高;
  2. 空值处理前置:所有判断先过滤NULL/空字符串,避免空值参与运算导致的异常或性能损耗;
  3. 可读性与精简平衡:简单场景用NVL2/DECODE精简代码,复杂场景用CASE保证可读性;
  4. 大数据量优化:通过索引、数据过滤、确定性函数提升执行效率,避免全表扫描和重复运算。

四、适用场景扩展

本文写法适用于制造业质检、实验室数据统计、物联网数值监控等场景,可直接复用或根据业务调整字段名/判断规则。核心逻辑可迁移至Oracle 11g/12c/19c等版本,兼容主流Oracle数据库环境。

http://www.jsqmd.com/news/673401/

相关文章:

  • 从理论到代码:我是如何复现EVO的ATE/RPE计算并与官方结果对齐的(含避坑点)
  • 从宁德新能源面试官视角,拆解Halcon/OpenCV工程师的硬核技能树(附避坑指南)
  • Workrave终极指南:告别重复性劳损的完整解决方案
  • DebateLab-个人博客(1)后端总体架构与比赛状态机设计
  • 魔兽争霸3终极优化指南:如何用WarcraftHelper解决老游戏兼容性问题
  • C语言学习笔记5
  • 3分钟学会ncmdump:终极网易云音乐NCM文件解密转换指南
  • Go语言如何做协程调度_Go语言协程调度原理教程【实用】
  • HTML怎么实现记住我功能_HTML checkbox保存登录状态【方法】
  • 想给游戏加个BGM?试试用C和minimp3实现一个轻量级跨平台音频播放模块
  • Qwen3.5-2B低门槛部署指南:无Linux经验用户也能完成的5步流程
  • 避坑指南:沁恒CH582/CH583 Sleep模式下RTC唤醒的中断与主频那些事儿
  • 阿里通义实验室“变形金刚“:当AI探索助手学会了按需切换记忆模式
  • SAP PS 项目预算按 “成本计划→预算分配→执行监控→调整→结算→关闭” 的阶段推进,核心表为 BPGE/BPJA(总计 / 年度预算)、BPBE(行项目)、RPSCO(汇总成本 / 预算),配合
  • 别再死记硬背了!用Python手把手教你构建NLP中的共现矩阵(附完整代码与SVD降维实战)
  • 终极风扇控制指南:5分钟让Windows电脑安静如新的完整教程
  • Gemma-3-270m入门指南:从模型选择到提问技巧的完整新手教学
  • 嵌入式BI革命:SaaS/ISV厂商如何用衡石科技快速上线数据分析能力
  • Debian 12.10 root 登录失败,两步解决!
  • AngularJS ng-model 指令
  • PCB绘制
  • Blazor + WASM + WebGPU 实时渲染面试突击包:含WebAssembly SIMD加速、GPU缓冲区绑定、帧同步调试全流程(仅限Q2开放下载)
  • 大恒相机取消曝光限制(超长曝光)设置与代码实现(C/C++/C#)
  • WinClaw安全实战 10|5分钟微信接入指南:零代码远程操控电脑,AI助手随身带
  • Gemini CLI Skills 技能扩展全景指南:内置、社区与自定义三条路径
  • 当今工程师Superpowers进化论:从VibeCoding到Agent IDE,源码级重构你的编码内核!
  • Debian 12.5 一键安装 Oracle 11GR2 单机
  • 告别CANtest和ECAN Tools:用Python脚本玩转ZLG/创芯CAN盒的自动化测试
  • 昆仑天工AI突破:游戏世界生成器实现实时可探索虚拟空间创建能力
  • EMCC 13.5 安装中断,如何清理 OMS 库?