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

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)';

错误原因

  1. CASE语句的问题:这段代码仅用于生成新的描述列MERCHANT_CATEGORY_CODE_DETAIL,不会修改原Merchant_Category_Code列的值。若要替换原列内容,需把CASE逻辑嵌入UPDATE语句中。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 13:55:36