首頁  >  問答  >  主體

mysql - 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

高洛峰高洛峰2743 天前729

全部回覆(1)我來回復

  • 巴扎黑

    巴扎黑2017-04-17 13:25:50

    一種效率並不高的方案, 我想想看有沒有更有效率的方法, 想到後在來編輯

    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 相同

    我得走人了 .

    回覆
    0
  • 取消回覆