根据此表的电话前缀号填充特定字段
___________________________________________________________
| id | telnum | name | country | continent |
-----------------------------------------------------------
| 01 | 003912377 | Smith | Italy | |
| 02 | 004412345 | White | UK | |
| 03 | 005454321 | Lopez | Argentina | |
我使用以下代码:
UPDATE telcountry_table
SET country =
CASE
WHEN left(telnum,4) = 0093 THEN 'Afghanistan'
WHEN left(telnum,5) = 00355 THEN 'Albania'
WHEN left(telnum,5) = 00213 THEN 'Algeria'
.
.
.
ELSE ''
END
完美无缺。我现在的问题是:我可以在同一代码中添加更多行来填充其他字段,例如(在此示例中)特定大陆,或者我必须进行另一个不同的查询吗?
简而言之,我的问题是:当前缀为“0044”时,代码必须在字段Country中写入元素“UK”,在Continent字段中写入“EUROPE”元素......依此类推。
感谢。
答案 0 :(得分:0)
我不认为您当前的数据模型是最优/标准化的,并且UPDATE令人费解的原因。为了使UPDATE正常工作,您需要一个WHERE子句来过滤您想要更新的“id”; CASE声明的结果,例如。当离开时,id = 02(telnum,4)= 0044.为此,您需要创建一个存储过程(一种解决方案是使用游标)。
但是,我会建议一种替代的标准化设计,如下所示:
我假设每个国家/地区可以有许多telnum前缀(区号):
create table areacodes
(
id int auto_increment primary key,
areacode varchar(10),
fkCountry int
);
insert into areacodes(areacode,fkCountry)
values
('0039',1),('00441',2),('0054',3);
create table countries(
id int auto_increment primary key,
country varchar(20)
);
insert into countries(country)
values('Italy'),
('UK'),('Algeria');
create table continents(
id int auto_increment primary key,
continent varchar(20));
insert into continents(continent)
values('Europe'),('North America'),('Asia'),
('Australia'),('Africa'),
('South America'), ('Antartica');
下表将各国与各大洲联系起来:
create table country_continent(
fkCountry int,
fkContinent int);
insert into country_continent(fkCountry,fkContinent)
values(1,3),(2,1),(3,5),(4,1),(5,1),(6,6)
最后,telcountry表。您需要将areacode与telnum分开并保存它们。然后,您可以使用areacode检索国家/地区。
create table telcountry_table(
id int,
areacode varchar(10),
telnum varchar(20),
name varchar (50)
);
insert into telcountry_table(id,areacode,telnum,name)
values
(1,'0039','234244','Di Maggio'),
(2,'00441','2345','White'),
(3,'0054','54321','Sergio');
您可以按以下方式找到国家和地区:
select country
from areacodes a join countries c
on c.id = a.fkCountry
where areacode = '00441'
和大陆:
select continent
from country_continent cc join continents c
on cc.fkContinent = c.id
where cc.fkCountry =
(
select c.id
from areacodes a join countries c
on c.id = a.fkCountry
where areacode = '00441'
)