2016-01-20 52 views
0

我必須通過使用業務規則來確保數據庫的有效性。 我用「選擇查詢」來瀏覽我桌子的每一行。 當一個錯誤被識別時,我將這個錯誤插入一個帶有消息的錯誤表中。SQL Server - Imbricate case return NULL

這是一個簡單的例子:

INSERT INTO SUPPLIER_ERR (numSupplier, nameSupplier,telephoneNumber, MESSAGE) 
SELECT numSupplier,nameSupplier,telephoneNumber, 
CASE 
WHEN telephoneNumber = '' 
    then 'Must be filled' 

When telephoneNumber NOT LIKE '+[0-9][0-9]([0-9][0-9])%' 
    then 'Must be to this format "+00(00)000000"' 

END AS message 

FROM dbo.supplier; 

此解決方案的作品,但在某個時候我的錯誤表我有一個空消息行時我疊瓦狀外殼。 例如:

WHEN LEN(numCustomer,2) = 'CN' 
    then 
    Case 
     when (RTRIM(mailCustomer) LIKE '.') 
     THEN 'Must be x'   
    end 
WHEN LEN(numCustomer) != 'CN' AND RTRIM(mailCustomer) != '' 
    THEN 'Must be empty' 

我明白爲什麼我得到空消息(當它執行第一種情況下,不執行第二)

WHEN LEN(numCustomer,2) = 'CN' 
    then 
    Case 
     when (RTRIM(mailCustomer) LIKE '.') 
     THEN 'Must be x'   
    end 

我的問題是:

我如何檢查我的信息是否爲空? (而不是插入到我的錯誤表中)

+2

你可以有一個更多選擇 - 從當前選擇的情況中,where子句檢查**消息不爲空**。 – daniel

+0

感謝您的幫助,我明白您對@Bridge回答的含義。 –

回答

0

select語句正在查看每一行 - 不只是那些您認爲有錯誤的行。如果未提供ELSE子句,則對於不符合您檢查的條件之一的每行,CASE語句將返回NULL。

因此,你有兩個選擇:

  1. 檢查每一行你現在的樣子,和那裏有沒有發現任何錯誤,該錯誤信息提供一個默認值:

INSERT INTO SUPPLIER_ERR (numSupplier, nameSupplier,telephoneNumber, MESSAGE) 
SELECT numSupplier, 
     nameSupplier, 
     telephoneNumber, 
     CASE 
     WHEN {Check 1 goes here} THEN 'Error message 1' 
     WHEN {Check 2 goes here} THEN 'Error message 2' 
     WHEN {Check 3 goes here} THEN 'Error message 3' 
     ELSE 'No error detected' 
     END 
  1. 只插入檢測到錯誤的行。請與一個WHERE條款 - 無論是檢查行匹配你的條件之一出現,或騙一點,只是返回的行其中返回的錯誤消息不是NULL:

INSERT INTO SUPPLIER_ERR (numSupplier, nameSupplier,telephoneNumber, MESSAGE) 
SELECT numSupplier, 
     nameSupplier, 
     telephoneNumber, 
     CASE 
     WHEN {Check 1 goes here} THEN 'Error message 1' 
     WHEN {Check 2 goes here} THEN 'Error message 2' 
     WHEN {Check 3 goes here} THEN 'Error message 3' 
     END 
WHERE CASE 
     WHEN {Check 1 goes here} THEN 'Error message 1' 
     WHEN {Check 2 goes here} THEN 'Error message 2' 
     WHEN {Check 3 goes here} THEN 'Error message 3' 
     END IS NOT NULL 
+0

第二個選擇看起來像個好主意。我不明白如何實施'WHERE'條款。在WHERE CASE中,我必須執行與第一種情況相同的檢查嗎? –

+0

Where子句只是CASE語句的一個副本,在末尾有'IS NOT NULL'卡住 – Bridge

+0

它正在工作!非常感謝你的幫助。 –