MYSQL INSERT基于3列的值

时间:2016-03-29 23:20:02

标签: mysql if-statement formula sql-insert

我有一个mysql数据库,我想基于三个不同数字字段的条件做一个SELECT / INSERT :( HI,OT和WC)。

我想要将一个名为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;

2 个答案:

答案 0 :(得分:0)

试试这个:

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

答案 1 :(得分:0)

您将单列的行插入表中似乎有点奇怪。这不是无效的,但有点奇怪。

首先,编写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

要对此进行测试,您可能希望在SELECT列表中包含一些其他列,以便您可以验证结果和/或在WHERE子句中包含一些谓词。

  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`) 

你会很高兴。

注意:必须将列名称&#34;包含在&#34;在反引号中,因为它不是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

注意:表达式IF(x,y,z)会导致MySQL将x评估为布尔值,如果x计算为TRUE,则返回y,否则返回z