2016-11-30 2 views
0

Я ищу некоторую помощь с SQL-запросом с конструкцией IF-THEN-ELSE. Он вращается вокруг автоматизма в моем приложении после вставки новой строки в «дампе»-таблице - в зависимости от значения одного столбца - для копирования в специальную таблицу.Конструкция CASE-WHEN-THEN-ELSE в SQL

Для осуществления этого, я сделал тестовую БД с таблицы Prob и таблицы prob2

Спусковой механизм находится под контролем. Теперь все еще приходит к тому, что делать с этим специальным правилом. Это зависит от значения «с»

На словах это то, что я хочу:

IF (the value in column c of the prob-table - from the row with the highest ID of the prob table = 2) 
THEN (Now, copy this line to the prob2 table) 
END IF 

Таким образом я могу для каждого значения «с» выполнять различные действия в IF-THEN - ELSEIF - THEN - ELSEIF - THEN - END IF конструкция.

Таблицы пробы:

- id |  a  | b | c | 
- ----+---------------+---+---+ 
- 1 |std745_900w | 5 | 4 | 
- ----+---------------+---+---+ 
- 2 |std745_900w | 2 | 3 | 
- ----+---------------+---+---+ 
- 3 |std745_900w | 1 | 9 | 
- ----+---------------+---+---+ 
- 4 |std745_900w | 3 | 2 | 
- ----+---------------+---+---+ 

Мой перевод в (не работает) SQL Query

IF 
    (SELECT c FROM prob WHERE id = (SELECT MAX(id) FROM prob) = 2) 
THEN 
    (INSERT INTO prob2 (id, a, b, c) 
    SELECT id, a, b, c FROM prob WHERE id = (SELECT MAX(id) FROM prob)) 
END IF 

запрос после IF в скобках) ->SELECT c FROM prob WHERE id = (SELECT MAX(id) FROM prob) < - работают Оке и результаты в «2» Запрос после THEN ->INSERT INTO prob2 (id, a, b, c) SELECT id, a, b, c FROM prob WHERE id = (SELECT MAX(id) FROM prob) < - хорошо работает SQL, однако, не понимает выражения «IF Statement».

Это MySQL на MariaDB

Может кто-нибудь помочь?

+0

Вы говорите, что у вас есть триггер вставки для таблицы, и вы хотите включить эту логику в этот триггер? –

+0

В MySQL an if ... then - else ... end if statement может использоваться только в хранимых программах (процедура, функция, триггер), вы не можете запускать его как есть. Извлечение данных из базы данных также немного отличается. – Shadow

+0

Да, в MariaDB вы можете определить триггер после вставки в таблицу. Это вызывает запрос SQL. Я тестировал его с помощью простого запроса, и это работает. Моя проблема кроется в тесте в IF-части конструкции it-then-else –

ответ

0

вы можете использовать

CASE WHEN (your_test) THEN (do_something_here) ELSE 

вы можете использовать много «если ... то»

0

Missing некоторые детали, но вы можете сделать это в MySQL процедурном языке и вызывать его из триггера:

CREATE PROCEDURE COPY_ROW() 
    BEGIN 
     DECLARE pId INT DEFAULT 0; 
     DECLARE pC INT DEFAULT 0; 

     SELECT id, c 
     INTO pId, pC 
     FROM prob 
     WHERE id = (SELECT MAX(id) FROM prob); 

     IF(pC = 2) THEN 
      INSERT INTO prob2 (id, a, b, c) 
      SELECT id, a, b, c FROM prob WHERE id = pId; 

     END IF; 
    END; 
+0

И это работает для mysql? –

+0

Да, это процедурный язык для MySql – aKiRa

+0

Er no plsql - это процедурный язык для Oracle –

0
SELECT @c := c FROM prob ORDER BY id DESC LIMIT 1; 
IF @c = 2 THEN 
    INSERT INTO prob2 (id, a, b, c) 
     SELECT id, a, b, c FROM prob ORDER BY id DESC LIMIT 1; 
END IF 

Вы были проблемы со скобками. И подзапросы для получения MAX(id) часто лучше делать через ORDER BY.

+0

Я полагаю, что эти строительные работы только в процедуре? MariaDB обеспечивает синтаксическую ошибку @c –

+0

True. 'IF', как заявление, работает только в хранимых процедурах. Не могли бы вы объяснить, что вы пытаетесь сделать? Там может быть еще более простой способ сделать это. –

0

Спасибо всем за советы и подсказки. Ответ на эту проблему - работа с процедурой. Спасибо вам всем!