2016-01-20 61 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

它正在工作!非常感谢你的帮助。 –