2012-10-01 53 views
4

現在我已經忍受了兩個小時了。我想選擇或插入一條記錄。如果記錄存在,則選擇他的ID,否則插入它並獲取新插入的ID。現在我試圖運行這個,但我仍然得到一個錯誤MySql如果存在select ELSE insert

SELECT CASE WHEN (SELECT COUNT(*) FROM Domains WHERE Domain = @domain)>0 
THEN 
    (SELECT Domain_ID FROM Domains WHERE Domain = @domain) 
ELSE   
    INSERT INTO Domains(Domain_ID,Domain,Disabled,Description) VALUES(@Domain_ID,@Domain,@Disabled,@Description); 
+0

爲什麼要查詢count(*)?只是查詢域匹配,如果會有非空結果,則返回它,否則插入數據。 – Zaffy

+0

你是否試圖在程序中做到這一點? – JHS

+0

我仍然得到了MySQL語法的懸念(所以我不會把它作爲答案),但我相信你需要沿着'IF EXISTS(SELECT 1 FROM DOMAIN WHERE Domain = @domain)'的方向行事。 ..而不是'SELECT CASE WHEN(SELECT COUNT(*)FROM Domains WHERE Domain = @domain)> 0' – LittleBobbyTables

回答

6

你的情況下,缺少結束

Case when (something) then (Some) 
else (another thing) end 

無論如何,你的其他必須返回一個選擇,插入不會返回任何東西。 如果要插入,如果不存在,然後返回插入的值(或返回,如果存在的話) 做到這一點:

INSERT INTO Domains(Domain_ID,Domain,Disabled,Description) VALUES(@Domain_ID,@Domain,@Disabled,@Description) where not exists (select 1 from Domains WHERE Domain = @domain); 

SELECT Domain_ID FROM Domains WHERE Domain = @domain 

如果不存在,這將插入,然後返回。如果已經存在,將不插入,並返回值

編輯2016年1月

最後的查詢將不會在MySql工作,這是一個MSSQL語法

+0

AFAIK,'CASE'應該在'END之前有'THEN' 「如果這是有道理的。 – redej

+1

MySQL不支持'INTO ... WHERE'? http://stackoverflow.com/questions/485039/mysql-insert-where-query – user1267259

+0

你是對的 - 補充說明 –

-1

我沒有看到,如果

If Not Exists(Select DomainId From Domains Where Domain = @domain) 
Begin 
    INSERT INTO Domains(Domain_ID,Domain,Disabled,Description) VALUES(@Domain_ID, @Domain, @Disabled, @Description);  
End 
Select @DomainID 

看來你似乎正在傳遞它,實際上我不明白爲什麼你需要從查詢中返回?

+0

這句話只能在存儲過程中使用。 –

1

沒有進入性能和緩存的影響,如果的Domain_ID是auto_increment場,一個簡單的方法來達到你想要的特定結果是使用ON DUPLICATE KEY子句INSERT聲明:

INSERT INTO Domains 
    (fld1, fld2, fld3) 
    VALUES(....) 
ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id); 

ON DUPLICATE KEY UPDATEMySQL documentation的尾部。