如何将2位CNT码或完整CNT名称转换为3位CNT码MySQL

时间:2017-03-10 15:24:01

标签: mysql navicat

我有一个MySQL数据库表,其中包含一个名为Country的列。有时它是一个完整的CNT名称,有时是ISO 3或ISO 2 CNT代码 - 取决于用于此表的源文件。国家/地区名称始终以大写字母( CANADA,POLAND等。)。

我需要在我的查询中添加一些语句,它可以将国家/地区名称/国家/地区ISO 3代码转换为ISO 2 CNT代码 - (CA,PL等)。

我尝试使用一个简单的解决方案: select left (Country, 2) from tb_name

这对所有国家都没用。如果我只拿“波兰”的前两个字母,那么我会得到'PO'而不是'PL'。

我将非常感谢您的任何建议。 非常感谢你提前。 这是我在这里发表的第一篇文章...我希望,这很容易理解。如果没有,请告诉我,我会改进。 :)

非常感谢!

阿德尔

3 个答案:

答案 0 :(得分:0)

由于列中的名称不一致,我建议使用如下所示的查找表:

countries
country_name | country_code
POLAND       | PL
POL          | PL
CANADA       | CA

country_name可以是主键(您可以在其他表格中添加更多名称),country_code可以是ISO国家/地区代码。

完成此操作后,您可以在查询中使用JOIN始终从此表中获取counry_code

答案 1 :(得分:0)

您需要另一张表,例如

CuntryISO2  CountryISO3 CountryName
PL          POL         POLAND
IT          ITA         ITALY

然后你可以加入你的桌子,加上像

这样的连接
on  myTab.Country = case(when length(myTab.Country) = 2 then CountryISO2
                         when length(myTab.Country) = 3 then CountryISO3
                         else CountryName end)

答案 2 :(得分:0)

评论太长了。

首先提取数据中的非2位数代码:

select distinct country
from t
where length(country) <> 2
group by country;

然后,将其加载到电子表格中,并将两位数代码添加到单独的列中。维基百科应该是2位数国家代码的良好来源。

然后,您可以创建一个巨大的case语句或表用于更新目的。

但是你需要从正确的任务开始。