2017-10-01 1 views
2

次のコードを更新して列を追加したり削除したりするにはどうすればよいですか?MySQL:このコードを再構成して中間列を追加および削除する方法

このコードは、「3ヤード」(「長さ」という名前)の値を持つ列から数値列(「LengthFloat」という名前)の値を計算します。

alter table sometable add Value float; 
alter table sometable add Units varchar(15); 

Update sometable 
    set Value = SUBSTRING_INDEX(SUBSTRING_INDEX(Length, ' ', 1), ' ', -1), 
     Units = SUBSTRING_INDEX(SUBSTRING_INDEX(Length, ' ', 2), ' ', -1); 

update sometable 
    set LengthFloat = case Units 
     when 'yards' then Value*3 
     when 'yard' then Value*3 
     when 'feet' then Value 
     when 'foot' then Value 
    end; 

alter table sometable drop column Value; 
alter table sometable drop column Units; 

答えて

0

コードはそのままの状態にしてください。

他の方法(ビューを使用)について説明している他の唯一の回答は非常に非効率的で、却下する必要があります(そこのコメントを参照)。

0
drop view if exists sometable_with_value_units; 

create view   sometable_with_value_units as 
select id, 
     SUBSTRING_INDEX(SUBSTRING_INDEX(Length, ' ', 1), ' ', -1) as value, 
     SUBSTRING_INDEX(SUBSTRING_INDEX(Length, ' ', 2), ' ', -1) as units 
    from sometable; 

select id, 
     case units 
      when 'yards' then value * 3 
      when 'yard' then value * 3 
      when 'feet' then value 
      when 'foot' then value 
     end as feet 
    from sometable_with_value_units; 

http://sqlfiddle.com/#!9/ed7ca1/3

+0

テーブルの更新を行うために更新しようとすると、エラーが発生する必要があります。 –

+0

ベーステーブルとビュー(ランダムな 'unit'sで' value'を合成する)とselect(一貫した 'feet'を合成する)はすべて' id'を提供します。更新する際には、選択項目「ON ID」で基本表にJOINしてください。より良いことに、「足」や「メートル」のような賢明な列を維持してください(面積測定用の「納屋」ではなく)ので、狂った中間結果を合成する必要はありません。それを新しい永続的な列にするか、またはJOINできる別のテーブルに入れます。 –

+0

私は仕事に参加しました。何らかの理由で、これは非常にゆっくりと実行されます。私はそれを殺してしまったので、最初の1,000行で動かしました。それは65秒かかりました(!!!)。タスクマネージャを見ると、CPUは28%(ほぼすべてmysql)で動作し、メモリ使用量は44%で、ディスク使用率は0%から4%、通常は0%で増加しました。私はすでに自分のばかげた値を置き換えるためにmy.cfgを最適化しているので、私の12GBのRAMがより良く利用されます。 –

0

確かに、長さが表現と周りいじることが可能である参照してください。しかし、それはSQLで苦しいです。代わりに...

私は戻って、使用する単位を決めます。私はおそらくメートル法を選ぶだろう。例えば、私はキロメートルではなく、オングストロームではなく、足ではなく、長さではなく、丈夫ではなく、光年ではなく、納屋ではない「メートル」を選ぶかもしれません。 (アプリが天文学を扱っていれば、光年を使うかもしれません。)次に、データベースではなくアプリでコンバージョンを行います。極端な状況を除いて列を追加したり削除したりすることはありません。

+0

私はデータが入って来る方法を何も制御していません。 –

+0

他の人はデータベースに直接 'INSERT 'をしていますか?それとも、データを受け取っているアプリがありますか?うまくいけば、後者。通常、データベースに挿入する前にデータをクレンジングする方が良いです。 –

+0

データベースは私の視点からはそのままです。私はデータマイニングのために準備しています。 –

関連する問題