SQL查询需求:依据CA标识字段提取或拼接对应CA列值
解决方案:单SQL查询实现需求
核心思路
直接用CASE语句判断每个CAx_ID是否匹配目标值(兼容大小写等效场景),匹配时直接返回对应CAx字段的实际值,若均不匹配则拼接三个CA字段的内容。
示例SQL代码
假设你的WF1_DATA表包含字段:ID, CA1_ID, CA1, CA2_ID, CA2, CA3_ID, CA3,可执行以下查询:
SELECT ID, CA1_ID, CA1, CA2_ID, CA2, CA3_ID, CA3, -- 生成目标新列 CASE -- 匹配CA1_ID(支持大小写不敏感) WHEN LOWER(CA1_ID) = 'ca' THEN CA1 -- 匹配CA2_ID WHEN LOWER(CA2_ID) = 'ca' THEN CA2 -- 匹配CA3_ID WHEN LOWER(CA3_ID) = 'ca' THEN CA3 -- 均不匹配则拼接三个字段 ELSE CONCAT(CA1, CA2, CA3) END AS TargetColumn FROM WF1_DATA;
关键说明
- 用
LOWER()处理大小写等效,确保'CA'、'ca'、'Ca'等格式都能匹配 - 每个
WHEN分支直接引用对应CAx字段,而非返回字符串标识(这是你之前失败的核心原因) - 若你的数据库不支持
CONCAT(),可替换为对应拼接语法:SQL Server用+,Oracle用||
存储过程版本(可选)
如果需要封装成存储过程,以MySQL为例:
DELIMITER // CREATE PROCEDURE GetFormattedWF1Data() BEGIN SELECT ID, CA1_ID, CA1, CA2_ID, CA2, CA3_ID, CA3, CASE WHEN LOWER(CA1_ID) = 'ca' THEN CA1 WHEN LOWER(CA2_ID) = 'ca' THEN CA2 WHEN LOWER(CA3_ID) = 'ca' THEN CA3 ELSE CONCAT(CA1, CA2, CA3) END AS TargetColumn FROM WF1_DATA; END // DELIMITER ; -- 调用存储过程 CALL GetFormattedWF1Data();
失败原因分析
你之前用带子查询的CASE返回标识而非字段值,大概率是子查询返回的是字符串(比如'CA1'),而非对应字段的实际取值。直接在CASE分支中引用字段即可解决,无需额外子查询。
内容的提问来源于stack exchange,提问作者dk96m
相关产品推荐
相关产品推荐

