2012-12-13 110 views
8

我有一個表foo,其中有一個NOT NULL列有一個默認的名爲message插入默認爲NOT NULL列,如果值爲null

CREATE TABLE foo(
    id int PRIMARY KEY, 
    message varchar(64) NOT NULL DEFAULT 'Hello' 
) 

有一個存儲過程bar是插入到foo

CREATE PROCEDURE bar(
    i_id int, 
    i_message varchar(64) 
) 
BEGIN 

    -- other logic 

    IF i_message IS NOT NULL THEN 
     INSERT INTO foo (id, message) VALUES (i_id, i_message); 
    ELSE 
     INSERT INTO foo (id, message) VALUES (i_id, DEFAULT); 
     -- could also be: INSERT INTO foo (id) VALUES (i_id); 
    END IF; 
END; 

你可以看到,我必須有條件地分支,以便我的插入使用默認值,如果​​爲空。對於只有一列來說很好,但考慮foo還有更多NOT NULL DEFAULT列 - 語法會變得笨拙。

是否有我可以用來指定插入的值應該回落到默認值,如果爲空的語法?我嘗試以下,但可以理解了語法錯誤:

INSERT INTO foo (id, message) VALUES (i_id, COALESCE(i_message, DEFAULT)); 
INSERT INTO foo (id, message) VALUES (i_id, IFNULL(i_message, DEFAULT)); 

回答

19
INSERT INTO foo (id, message) 
    VALUES 
    (i_id, IFNULL(i_message,DEFAULT(message))); 
+0

輝煌!謝謝。 –

+0

這在MSSQL服務器中可能如何? – user1844205

+0

@ user1844205:擊敗我,從不使用MSSQL,搜索MSSQL的文檔或在SO上提出問題。 – Wrikken