SQL中更新Merchant_Category_Code列值失败,求解决方案
修改Merchant_Category_Code列失败的问题分析及解决
问题说明
尝试修改Merchant_Category_Code列的值,先后使用CASE语句和UPDATE语句均未成功。
尝试过的代码
CASE语句
CASE WHEN MERCHANT_CATEGORY_CODE = 6051 THEN 'Quasi Cash–Merchant' WHEN MERCHANT_CATEGORY_CODE = 4829 THEN 'Wire Transfer Money Orders & Money Transfer' WHEN MERCHANT_CATEGORY_CODE = 6012 THEN 'Member Financial Institution–Merchandise And Services' WHEN MERCHANT_CATEGORY_CODE = 6011 THEN 'Member Financial Institution–Automated Cash Disbursements' WHEN MERCHANT_CATEGORY_CODE = 7372 THEN 'Computer Programming, Data Processing and Integrated System Design Services' WHEN MERCHANT_CATEGORY_CODE = 5812 THEN 'Eating Places and Restaurants' WHEN MERCHANT_CATEGORY_CODE = 5817 THEN 'Digital Goods: Applications (Excludes Games)' WHEN MERCHANT_CATEGORY_CODE = 3010 THEN 'Royal Dutch Airlines (KLM Airlines)' WHEN MERCHANT_CATEGORY_CODE = 3007 THEN 'Air France' WHEN MERCHANT_CATEGORY_CODE = 5735 THEN 'Record Shops' ELSE 'CHECK' END AS MERCHANT_CATEGORY_CODE_DETAIL
UPDATE语句
UPDATE "RED"."TRANSACTIONS" SET MERCHANT_CATEGORY_CODE=3035 ,MERCHANT_CATEGORY_CODE='TAP Air Portugal (TAP)';
错误原因
- CASE语句的问题:这段代码仅用于生成新的描述列
MERCHANT_CATEGORY_CODE_DETAIL,不会修改原Merchant_Category_Code列的值。若要替换原列内容,需把CASE逻辑嵌入UPDATE语句中。 - UPDATE语句的问题:
- 同一列
MERCHANT_CATEGORY_CODE被重复赋值,一次是数字3035,一次是字符串'TAP Air Portugal (TAP)',数据类型冲突,数据库直接报错。 - 未添加
WHERE条件,执行后会更新全表所有行,不符合精准修改的需求。
- 同一列
正确解决方法
方案1:新增描述列(不修改原列)
若无需改动原列,仅需新增对应中文描述列,执行以下SQL:
SELECT MERCHANT_CATEGORY_CODE, CASE WHEN MERCHANT_CATEGORY_CODE = 6051 THEN '准现金类商户' WHEN MERCHANT_CATEGORY_CODE = 4829 THEN '电汇、汇票及转账服务' WHEN MERCHANT_CATEGORY_CODE = 6012 THEN '会员金融机构——商品及服务' WHEN MERCHANT_CATEGORY_CODE = 6011 THEN '会员金融机构——自动现金支付' WHEN MERCHANT_CATEGORY_CODE = 7372 THEN '计算机编程、数据处理及集成系统设计服务' WHEN MERCHANT_CATEGORY_CODE = 5812 THEN '餐厅及餐饮场所' WHEN MERCHANT_CATEGORY_CODE = 5817 THEN '数字商品:应用程序(不含游戏)' WHEN MERCHANT_CATEGORY_CODE = 3010 THEN '荷兰皇家航空公司(KLM)' WHEN MERCHANT_CATEGORY_CODE = 3007 THEN '法国航空公司' WHEN MERCHANT_CATEGORY_CODE = 5735 THEN '唱片店' ELSE '待核查' END AS MERCHANT_CATEGORY_CODE_DETAIL FROM "RED"."TRANSACTIONS";
若需永久保存该列,先添加列再批量填充:
ALTER TABLE "RED"."TRANSACTIONS" ADD COLUMN MERCHANT_CATEGORY_CODE_DETAIL VARCHAR(200); UPDATE "RED"."TRANSACTIONS" SET MERCHANT_CATEGORY_CODE_DETAIL = CASE WHEN MERCHANT_CATEGORY_CODE = 6051 THEN '准现金类商户' -- 其他规则同上 ELSE '待核查' END;
方案2:直接修改原列的值
注意:若原列为数值类型,无法直接存储字符串,需先修改列数据类型,再执行更新:
-- 第一步:修改列类型为字符串(可根据需求调整长度) ALTER TABLE "RED"."TRANSACTIONS" ALTER COLUMN MERCHANT_CATEGORY_CODE TYPE VARCHAR(100); -- 第二步:批量更新对应值 UPDATE "RED"."TRANSACTIONS" SET MERCHANT_CATEGORY_CODE = CASE WHEN MERCHANT_CATEGORY_CODE = '6051' THEN '准现金类商户' WHEN MERCHANT_CATEGORY_CODE = '4829' THEN '电汇、汇票及转账服务' -- 其他对应规则... ELSE MERCHANT_CATEGORY_CODE -- 保留未匹配的原始值 END -- 添加WHERE条件,仅更新需要修改的行 WHERE MERCHANT_CATEGORY_CODE IN ('6051','4829','6012','6011','7372','5812','5817','3010','3007','5735');
若仅需更新单个值(如把编码3035替换为对应航空公司名称),执行:
UPDATE "RED"."TRANSACTIONS" SET MERCHANT_CATEGORY_CODE = 'TAP葡萄牙航空(TAP)' WHERE MERCHANT_CATEGORY_CODE = '3035'; -- 原列为数值类型时去掉引号写3035
内容的提问来源于stack exchange,提问作者Mr.B
相关产品推荐
相关产品推荐

