2016-03-29 13 views
2

私はmysqlデータベースを持っており、3つの異なる数値フィールド(HI、OT、WC)の条件に基づいてSELECT/INSERTを行いたいと思います。MYSQL INSERTは3列の値に基づいています

私は、以下の条件の値ATと呼ばれるフィールドに挿入する:

HI if HI > OT 
else 
WC if WC < OT 
else 
OT 

このような何かを、私はそれが正しいように見えることはできません。

INSERT INTO variations (AT) 
SELECT 

HI if HI > OT 
else 
WC if WC < OT 
else 
OT, 
FROM archive; 
+0

通常、ステートメントにVALUES句を挿入しないでください。 –

+0

クエリ文に 'IF'を使用することはできません。 ['CASE'](https://dev.mysql.com/doc/refman/5.7/en/case.html)を使用する必要があります。それぞれのステートメントの構文については、使用する際にそのドキュメントを参照する必要があります。 – tadman

答えて

0

はこれを試してみてください。

mysql> INSERT INTO variations (AT) 
    ->SELECT CASE WHEN HI > OT THEN HI 
    ->WHEN WC < OT THEN WC ELSE OT END FROM archive; 
+0

これは非常に初めて完全に機能しました!ありがとう、 – Richard

+0

それが動作する場合、あなたは答えとして質問をマークすることができます! –

0

テーブルに1列の行を挿入するのはちょっと変わったようです。それは無効ではありませんが、少し奇妙です。

まず、SELECT文を記述します。 IFは、MySQLでは有効なキーワードではありません。最も近いANSI標準の同等語はCASEの式です。 MySQLはまた、非標準のIF()機能を便利に提供します。これをテストする

SELECT CASE 
      WHEN t.hi > t.ot THEN t.hi 
      WHEN t.wc < t.ot THEN t.wc 
      ELSE t.ot 
     END AS `at` 
    FROM archive t 

、あなたはおそらく、あなたが結果を検証し、および/またはWHERE句でのいくつかの述語を含めることができるようにSELECTリスト内のいくつかの他の列を含めます。

SELECT CASE 
      WHEN t.hi > t.ot THEN t.hi 
      WHEN t.wc < t.ot THEN t.wc 
      ELSE t.ot 
     END AS `at` 
     , t.hi 
     , t.wc 
     , t.ot 
    FROM archive t 

これはテスト用です。あなたが挿入したい行を返すSELECTを持ってたら、そしてちょうどSELECT

INSERT INTO variations (`at`) 

を追加し、あなたが行ってもいいでしょう。

注:ではありません。バックエンドでは列名を "at"で囲む必要があります。これはMySQLの予約語ではないためです。しかし、私は、たとえ予約語でないとしても、MySQLのキーワードであるすべての識別子(例えばカラム名)にバッククォートを付ける傾向があります。

MySQLはCASEの代わりに表現します。同等の結果は、MySQL IF()関数をネストする式で得ることができます。たとえば、次のように

SELECT IF(t.hi>t.ot,t.hi,IF(t.wc<t.ot,t.wc,t.ot)) AS `at` 
    FROM archive t 

注:MySQLはブール値としてxを評価するために発生し、xがTRUEと評価された場合、その後zを返すy他返しIF(x,y,z)表現。

+0

これも同様に機能しました!ありがとうございました – Richard

関連する問題