如何用CASE与CONCAT生成ComponentStored列的SQL查询报错求助
正确的SQL字段拼接解决方案
原代码中的错误点
- 第一个CASE语句:
- CASE判断的字段错误,应该是
Component而非ComponentStored(目标列是要生成的,不能作为判断条件) - 拼接时错误使用了
Component字段,实际应该拼接Storage字段 - 缺少
END关键字结束CASE块,也没有给生成的列指定别名 - 对'BETA'的处理错误使用了'ALP-'前缀,应该是'BET-'
- CASE判断的字段错误,应该是
- 第二个CASE语句:
CASE NEW COL是无效语法,CASE后应直接写判断的字段或表达式- 没有完成与
Storage字段的拼接操作 - 同样缺少列别名
正确的SQL实现
根据需求,针对Component为'ALPHA'和'BETA'的记录,拼接缩写与Storage字段生成新列,以下是适配不同数据库的写法:
1. SQL Server 版本
SELECT Component, Storage, CASE WHEN Component = 'ALPHA' THEN 'ALP-' + LTRIM(STR(Storage)) -- 若Storage是数值类型,转字符串后拼接 WHEN Component = 'BETA' THEN 'BET-' + CAST(Storage AS VARCHAR(50)) -- 若Storage是字符串类型,直接拼接 ELSE Component -- 非目标记录返回原Component字段 END AS ComponentStored FROM Inventory WHERE Component IN ('ALPHA', 'BETA') -- 仅处理目标记录,如需保留其他记录可去掉此句
2. 通用数据库版本(MySQL/Oracle等)
SELECT Component, Storage, CASE WHEN Component = 'ALPHA' THEN CONCAT('ALP-', Storage) WHEN Component = 'BETA' THEN CONCAT('BET-', Storage) ELSE Component END AS ComponentStored FROM Inventory WHERE Component IN ('ALPHA', 'BETA')
说明
- 使用
CASE WHEN的搜索式语法,比简单CASE更灵活处理不同条件 - 确保拼接时字段类型一致:数值类型需转换为字符串类型后再拼接,避免类型错误
- 通过
WHERE Component IN ('ALPHA', 'BETA')过滤仅处理目标记录,若需要保留表中所有记录,去掉该WHERE子句即可 - 用
AS ComponentStored给生成的新列指定别名,匹配需求中的列名
内容的提问来源于stack exchange,提问作者Matthew Stanley
相关产品推荐
相关产品推荐

