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