首页 > sql动态列的问题?

sql动态列的问题?

如下表
province_name province_code city_name city_code country_name contry_code
北京 110000 北京 110000 东城 110101
天津 120000 天津 120000 和平 120101
河北 130000 石家庄 130100 长安 130102
河北 130000 唐山 130200 路南 130202
河北 130000 秦皇岛 130300 海港 130302
河北 130000 邯郸 130400 复兴 130404

在查询数据的时候
我想 如果city_name是天津或者北京地时候 把列 country_name和country_code的值赋值给 列city_name和city_code


一种效率并不高的方案, 我想想看有没有更加高效的方法, 想到后在来编辑

create table ttd(
pname varchar(30),
pcode int,
cname varchar(30),
ccode int,
yname varchar(30),
ycode int
);

insert into ttd(pname, pcode, cname, ccode, yname, ycode) values 
('北京', 110000, '北京', 110000,'东城', 110101),
('天津',120000, '天津', 120000, '和平', 120101),
('河北', 130000, '石家庄', 130100, '长安', 130102),
('河北', 130000, '唐山', 130200, '路南', 130202),
('河北', 130000, '秦皇岛', 130300, '海港', 130302),
('河北', 130000, '邯郸', 130400, '复兴', 130404);


select pname, pcode, yname, ycode from ttd where pname in ('北京', '天津')
union
select pname, pcode, cname, ccode from ttd where pname not in ('北京', '天津')

相对来说这种方案效率会高于上方的方式

select pname, pcode, 
case pname
when '北京' then yname
when '天津' then yname
else cname
end as cname,
case pname
when '北京' then ycode
when '天津' then ycode
else ccode
end as ccode
from ttd

如果是 mysql 的话还可以这么玩, 在 postgresql 中怎么试都不过..

select pname, pcode, if(cname=pname, yname, cname) as cname, if (cname=pname, ycode, ccode) as ccode  from ttd 

还有个思路是 如果 cname=pname 就替换成 null 然后用 isnull 判断是取 yname 或者 cname , 当然这种方案并不靠谱, replace 函数貌似不支持替换一个字段...

当然啦, 这俩放方案的前提是你的 北京和天津 的 cname 要和 pname 一样,才可以用

我只是有点无聊. 其实实现这个功能的方案还有很多种, 在比如你单独返回一个 cname=pname as b 这样你在程序里面取 b ? yname : cname 当然也要和刚刚说的一样 cname 和 pname 相同

我得走人了 .

【热门文章】
【热门文章】