MYSQL 根据 3 列的值插入

MYSQL INSERT based on values from 3 columns

我有一个 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;

试试这个:

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

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

首先,编写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 列表中包含一些其他列,以便验证结果 and/or 在 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 是 returning 你想要插入的行,然后就在 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

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