2016-11-30 83 views
0

我在尋找一些有關IF-THEN-ELSE構造的SQL查詢的幫助。 它通過在「dump」--table中插入新行後取決於一列的值 - 在我的應用程序中圍繞自動運行來複制到特殊表。SQL中的CASE-WHEN-THEN-ELSE構造

爲了鍛鍊吧,我做了一個試驗DB與表概率和一張桌子prob2

的觸發機制是在控制之下。 現在它仍然涉及到如何處理這個特殊規則。這取決於「C」的值

在口頭上,這是我想要的:

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 

這樣我可以爲「C」執行一個不同的動作的每一個值IF-THEN - ELSEIF - 然後 - ELSEIF - 然後 - 如果建設。

表概率:

- 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查詢

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) < - 工作和OKE結果爲「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語句」的表達式。

這是一個MariaDB上的mysql

任何人都可以幫忙嗎?

+0

你是說你在表概率上有一個插入觸發器,並且你想在這個觸發器中包含這個邏輯? –

+0

在MySQL中,如果... then - else ... end if語句只能用於存儲的程序(過程,函數,觸發器),則無法按原樣運行。從數據庫檢索數據也稍有不同。 – Shadow

+0

是的,在MariaDB中,您可以在插入表格後定義觸發器。這會觸發一個SQL查詢。我用一個簡單的查詢來測試它,並且工作。我的麻煩在於it-then-else構造的IF部分的測試 –

回答

0

可以使用

CASE WHEN (your_test) THEN (do_something_here) ELSE 

您可以使用許多「時......那麼」

0

缺少一些細節,但你可以在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沒有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

謝謝大家的提示和提示。使用過程是解決這個問題的方法。 感謝大家!