SQL中如何将货币符号转换为对应标准货币代码
货币符号转ISO标准货币代码实现方案
完全可以实现,核心要先解决部分货币符号多币种共用的歧义问题,不要直接做简单的1:1硬映射——比如$不是美元专属,加元、澳元、港币等十多种货币都用这个符号,£、¥也存在多币种共用的情况。具体落地可以按下面的步骤做,能覆盖欧元、加元等绝大多数主流货币场景:
第一步:先匹配无歧义专属符号
先整理1:1无冲突的符号映射表,这部分可以直接转换不需要额外判断,常见的专属符号对应关系如下:€→EUR(欧元)₽→RUB(俄罗斯卢布)₹→INR(印度卢比)₩→KRW(韩元)₺→TRY(土耳其里拉)₦→NGN(尼日利亚奈拉)
另外如果你的数据里存在带地区前缀的符号(比如CA$、US$、AU$、CN¥),优先匹配这部分内容,前缀直接对应货币所属地区,准确率100%,可以先把这部分数据处理完减少后续歧义处理量。
第二步:处理歧义符号的映射
针对$、£、¥这类多币种共用的符号,不要直接写死映射关系,按优先级走判断规则:- 优先用同条数据的关联字段判断:如果数据源里附带交易国家/地区、结算地这类字段,直接结合字段匹配即可,比如
$对应国家字段为加拿大就映射CAD,为美国就映射USD;£对应国家为英国就映射GBP,这是准确率最高的判断方式。 - 没有辅助字段就用业务场景白名单裁剪:你本身有一个存标准货币代码的数据源,可以先把这个数据源里实际出现过的货币代码整理成白名单,比如你的业务是北美跨境结算,白名单里只有
USD、CAD、EUR、GBP四种货币,那碰到$符号就只需要在白名单对应的候选里判断,不用考虑其他小众币种,大幅降低误判概率。 - 最后加兜底校验:把经过前两步还没法确定映射关系的记录打上待校验标记,抽人工核对,同时迭代你的映射规则即可。
- 优先用同条数据的关联字段判断:如果数据源里附带交易国家/地区、结算地这类字段,直接结合字段匹配即可,比如
下面是一段可直接参考的核心转换逻辑代码:
# 无歧义专属符号映射表 unambiguous_symbol_map = { "€": "EUR", "₽": "RUB", "₹": "INR", "₩": "KRW", "₺": "TRY", "₦": "NGN" } # 歧义符号+地区匹配规则 ambiguous_symbol_rule = { "$": { "US": "USD", "CA": "CAD", "AU": "AUD", "HK": "HKD", "SG": "SGD", "NZ": "NZD" }, "£": { "GB": "GBP", "EG": "EGP", "SY": "SYP" }, "¥": { "CN": "CNY", "JP": "JPY" } } def convert_symbol_to_code(symbol: str, region_code: str = None, scene_currency_whitelist: list = None) -> str: # 先匹配带前缀的特殊符号,比如CA$、US$ for prefix, code in [("CA", "CAD"), ("US", "USD"), ("AU", "AUD"), ("HK", "HKD"), ("CN", "CNY"), ("JP", "JPY")]: if symbol.startswith(prefix) and symbol.endswith(("$", "¥")): return code # 匹配无歧义符号 if symbol in unambiguous_symbol_map: return unambiguous_symbol_map[symbol] # 处理歧义符号 if symbol in ambiguous_symbol_rule: # 优先用地区码匹配 if region_code and region_code in ambiguous_symbol_rule[symbol]: return ambiguous_symbol_rule[symbol][region_code] # 用场景白名单匹配 if scene_currency_whitelist: candidate_codes = [c for c in ambiguous_symbol_rule[symbol].values() if c in scene_currency_whitelist] if len(candidate_codes) == 1: return candidate_codes[0] # 无法匹配的返回标记走人工校验 return "NEED_MANUAL_CHECK"
注意:不要直接照搬全量公共货币映射表,一定要结合你自己的业务场景裁剪规则,比如你做中欧贸易场景根本不会出现埃及镑、尼日利亚奈拉这类货币,冗余的映射规则反而会导致误判。
内容的提问来源于stack exchange,提问作者KKU
相关产品推荐
相关产品推荐

