You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 21:35:27