SQL Server - Imbricate case返回NULL

时间:2016-01-20 10:29:12

标签: sql-server case

我必须使用业务规则来确保数据库的有效性。 我使用“选择查询”来浏览我表格的每一行。 当识别出错误时,我将此错误插入带有消息的错误表中。

这是一个简单的例子:

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;

这个解决方案有效,但有时候在我的错误表中我有一个空消息行,当我是一个imbricated case。 例如:

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

我的问题是:

如何查看我的邮件是否为空? (而不是在我的错误表中插入)

1 个答案:

答案 0 :(得分:0)

select语句正在查看每一行 - 而不仅仅是那些您认为有错误的行。如果未提供CASE子句,则ELSE语句将为不符合您已检查过的条件之一的每一行返回NULL。

因此,您有两种选择:

  1. 按现在检查每一行,并为找不到任何错误的错误消息提供默认值:
  2. 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:
    2. 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