2012-03-22 28 views
3

我有一張桌子,裏面有以下列。用於更新輸入參數不爲空的表列的SQL查詢?

Ticket_id (Primary key, Int) 
Attachment1 (varchar) 
Attachment2 (varchar) 
Attachment3 (varchar) 
Attachment4 (varchar) 
Attachment5 (varchar) 

我在寫一個存儲過程來更新這個表。上述6列有6個輸入參數。

@Attached_File1 VARCHAR(MAX), 
@Attached_File2 VARCHAR(MAX), 
@Attached_File3 VARCHAR(MAX), 
@Attached_File4 VARCHAR(MAX), 
@Attached_File5 VARCHAR(MAX), 
@Ticket_ID BIGINT 

我想編寫一個sql查詢,它將使用輸入參數中指定的值更新表。但我不能用null覆蓋附件列。我的意思是我只需要使用那些包含數據的參數。例如,如果表格行[10,「aaa」,「bbb」,null,null,null]和輸入參數是(10,null,null,「ccc」,「ddd」, null)然後在更新後,該行將變爲[10,「aaa」,「bbb」,「ccc」,「ddd」,null]

如何檢查空/空字符串並相應地生成更新查詢做到這一點?

+1

如果這是SQL Server,那麼「plsql」標記不正確。 – 2012-03-22 11:45:09

+1

您是否必須關心已經非空的列的非空輸入參數?如果是這樣,補救措施是什麼? – 2012-03-22 11:46:56

回答

5

您可以使用ISNULL

UPDATE table_name SET 
    Attachment1 = ISNULL(Attachment1, @Attached_File1), 
    Attachment2 = ISNULL(Attachment2, @Attached_File2), 
    Attachment3 = ISNULL(Attachment3, @Attached_File3), 
    Attachment4 = ISNULL(Attachment4, @Attached_File4), 
    Attachment5 = ISNULL(Attachment5, @Attached_File5) 
WHERE Ticket_id = @Ticket_ID 

該解決方案不會覆蓋與新的現有價值。如果你想這樣做,你應該圍繞切換值:

ISNULL(@Attached_File1, Attachment1) 
+0

謝謝Anisus,這個作品完美:) – 2012-03-22 12:06:36

+0

不客氣! – ANisus 2012-03-22 12:07:29

1

你可以簡單地;

SET 
    AttachmentX = ISNULL(AttachmentX, @Attached_FileX) 

,或者如果PARAMS可以爲空字符串

AttachmentX = ISNULL(AttachmentX, NULLIF(@Attached_FileX, '')) 
+0

這不是錯誤的方法嗎? OP要防止NULL參數被寫入... – MatBailie 2012-03-22 12:06:50

2

你可以試試這個:

update MY_TABLE set Attached_File1 = ISNULL(@parameter1, Attached_File1); 
+1

不是sql-server使用'@'而不是':'參數? – MatBailie 2012-03-22 11:51:37

+1

@Dems:你是對的,謝謝 – 2012-03-22 11:53:13

1

在你UPDATE聲明中您可以使用COALESCE語句,例如:

SET Attachment1 = COALESCE(@Attached_File1, Attachment1) 

如果@Attached_File1NULL那麼當前值Attachment1將實際上保持不變。

+0

這沒有奏效,其他欄目已被覆蓋。 – 2012-03-22 12:14:25

+0

我支持這個答案,沒有理由這不應該工作 - 請重新檢查你的代碼,並注意,不同於'ISNULL'參數是在相反的順序'COALESCE(@ Attached_File1,Attachment1)'而不是'COALESCE(附件1 ,@ Attached_File1)''所以你不能用'COALESCE'來查找/替換'ISNULL'。 – 2012-03-22 12:18:47