Hive不同格式货币列对比异常:CASE转换后仍用原始列对比
解决CASE转换后未生效的SQL货币字段对比问题
嘿,我懂你踩的这个坑了——你在SELECT语句里写了CASE转换逻辑,但关联/过滤条件里还是在用源表的原始b.b_curreny字段和目标表的acc.CURRENCY直接对比,这就导致系统还是拿'C'和'CAD'硬比,肯定匹配不上呀!
给你几个实用的解决办法,按需挑选:
方法1:在关联条件里直接嵌入CASE转换逻辑
直接把转换逻辑写到对比的核心位置,让系统用转换后的值去匹配目标表:
SELECT COUNT(*) AS count FROM b_ACCOUNT b JOIN account acc ON CASE WHEN b.b_curreny = 'C' THEN 'CAD' WHEN b.b_curreny = 'U' THEN 'USD' ELSE b.b_curreny -- 兜底处理未知货币代码 END = acc.CURRENCY;
方法2:用子查询/CTE先转换再对比
如果转换逻辑复杂,或者需要多次复用转换后的值,先把源表的货币格式统一好再关联,可读性会更高:
子查询版本
SELECT COUNT(*) AS count FROM ( SELECT CASE WHEN b_curreny = 'C' THEN 'CAD' WHEN b_curreny = 'U' THEN 'USD' ELSE b_curreny END AS converted_currency, * -- 按需选择字段,尽量避免用* FROM b_ACCOUNT ) b JOIN account acc ON b.converted_currency = acc.CURRENCY;
CTE版本(更清爽)
WITH converted_source AS ( SELECT CASE WHEN b_curreny = 'C' THEN 'CAD' WHEN b_curreny = 'U' THEN 'USD' ELSE b_curreny END AS converted_currency, b_curreny, -- 保留原始值方便排查问题 -- 其他需要的业务字段 * FROM b_ACCOUNT ) SELECT COUNT(*) AS count FROM converted_source b JOIN account acc ON b.converted_currency = acc.CURRENCY;
方法3:简单映射用REPLACE(适合单字符转多字符)
因为你的映射关系是单字符对应固定多字符,用两次REPLACE也能快速搞定,代码更简洁:
SELECT COUNT(*) AS count FROM b_ACCOUNT b JOIN account acc ON REPLACE(REPLACE(UPPER(b.b_curreny), 'C', 'CAD'), 'U', 'USD') = acc.CURRENCY;
这里加UPPER是为了兼容源表可能存在的小写'c'/'u',如果源表只有大写可以去掉。
额外小提示
- 先单独跑个查询验证转换是否正确,比如:
SELECT b_curreny, CASE WHEN b_curreny='C' THEN 'CAD' WHEN b_curreny='U' THEN 'USD' ELSE b_curreny END AS converted_currency FROM b_ACCOUNT;
- 如果有其他货币类型,一定要在CASE里加ELSE分支,不然这些数据会被转换成NULL,导致匹配失败。
内容的提问来源于stack exchange,提问作者Anson
相关产品推荐
相关产品推荐

