2016-03-29 2 views
2

У меня есть база данных mysql, и я хотел бы сделать SELECT/INSERT на основе трех разных полей: (HI, OT и WC).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

Кажется немного странным, что вы вставляете строки с одним столбцом в таблицу. Это не неверно, но это немного странно.

Сначала напишите инструкцию 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, так что вы можете проверить результат и/или включать некоторые предикаты в ИНЕКЕ.

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 добавить

INSERT INTO variations (`at`) 

и вы будете хорошо идти.

ПРИМЕЧАНИЕ: Это не обязательным для включения имени столбца «at» в backticks, так как это не зарезервированное слово 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.

+0

Это сработало! Спасибо – Richard

Смежные вопросы