如何使用CASE WHEN语句针对两种文档类型查询文档路径?
正确的CASE WHEN实现文档路径查询
原SQL存在的问题
- CASE WHEN子句中直接嵌套
FROM查询的写法不符合语法,标量子查询必须用括号包裹 - 两个CASE分支使用了重复的别名
DOCS,会触发列名重复错误 - 主查询扫描全表并逐行执行子查询,效率低下且逻辑不符合需求
针对需求的正确实现方式
方式1:一次性获取两种文档类型的路径(聚合查询)
如果需要同时得到DOC_NO为'A112'(DOCTYPE=1)和'B331'(DOCTYPE=2)的扫描路径,用条件聚合更高效:
SELECT MAX(CASE WHEN DOC_NO = 'A112' AND DOCTYPE = 1 THEN SCAN_PATH END) AS DOC_TYPE1_SCAN_PATH, MAX(CASE WHEN DOC_NO = 'B331' AND DOCTYPE = 2 THEN SCAN_PATH END) AS DOC_TYPE2_SCAN_PATH FROM documents;
使用MAX(或MIN)聚合是为了确保每个条件只返回一条结果,避免多行冗余。
方式2:按每行文档类型匹配对应路径(关联子查询)
如果需要主表每行根据自身DOCTYPE,返回对应指定DOC_NO的扫描路径:
SELECT d.DOC_PATH, CASE WHEN d.DOCTYPE = 1 THEN (SELECT SCAN_PATH FROM documents WHERE DOC_NO = 'A112' AND ROWNUM = 1) WHEN d.DOCTYPE = 2 THEN (SELECT SCAN_PATH FROM documents WHERE DOC_NO = 'B331' AND ROWNUM = 1) END AS DOC_SCAN_PATH FROM documents d;
注意:ROWNUM=1是Oracle特有的写法,确保子查询只返回一条记录;如果是其他数据库(如MySQL),可替换为LIMIT 1。
方式3:直接过滤目标文档(最简写法)
如果只是想查询这两个特定文档的路径,无需CASE WHEN,直接过滤即可:
SELECT DOC_PATH, SCAN_PATH, DOCTYPE FROM documents WHERE (DOC_NO = 'A112' AND DOCTYPE = 1) OR (DOC_NO = 'B331' AND DOCTYPE = 2);
内容的提问来源于stack exchange,提问作者johnjs
相关产品推荐
相关产品推荐

