2013-02-13 111 views
0

我有一个SQL查询,其中包括以下语句在CASE WHEN语句不工作,由于NULL SQL不平等值

SELECT 
    (CASE 
     WHEN field1 > 0 THEN field1 
     ELSE (field2 * field3) 
    END) AS result 
FROM table 

这应该返回FIELD1的价值,除非是“0”,在该情况下该声明返回两个其他字段的产品。

我遇到的问题是,如果field1为NULL,则此语句返回NULL。

我想修改我的SQL,以便在field1为NULL时返回字段2 & 3的产品,就像在field1为'0'时一样。

我曾尝试以下:

SELECT 
    (CASE 
     WHEN field1 > 0 THEN field1 
     WHEN field1 IS NULL THEN (field2 * field3) 
     ELSE (field2 * field3) 
    END) AS result 
FROM table 

但NULL似乎仍然通过语句和NULL渗透每当FIELD1为NULL仍然返回。

+0

首先检查“NULL”。 – Kermit 2013-02-13 14:56:37

+5

你确定'field2'或'field3'不是'NULL'吗? – Dukeling 2013-02-13 14:56:56

+2

您的查询已经是你想要的了。当'field1'为'NULL'时,它返回产品'field2 * field3'。如果它们中的任何一个通过'field2'或'field3'也是'NULL',则(返回的)产品将是'NULL'。 – 2013-02-13 15:05:32

回答

4

您的查询已经是你想要的了。当field1NULL时,它返回产品field2 * field3。如果field2field3之一虽然是NULL,(返回的)产品将是NULL

如果你想被返回一些值(0也许)当其中一方是NULL,你可以改变CASE

SELECT 
    (CASE 
     WHEN field1 > 0       -- when field1 > 0 
      THEN field1 
     WHEN field2 IS NULL OR field3 IS NULL -- when field1 = 0 or NULL 
      THEN 0 
     ELSE field2 * field3 
    END) AS result 
FROM table ; 

或者干脆:

SELECT 
    (CASE 
     WHEN field1 > 0 
      THEN field1 
     ELSE COALESCE(field2 * field3, 0) 
    END) AS result 
FROM table ; 
+0

谢谢 - 你是对的 - 我在错误的地方寻找错误 - 这是另外两个有时包含NULL的字段 – PJW 2013-02-13 15:26:07

-1

为了帮助您诊断此问题,使用这样的事情:

SELECT 
    (CASE 
     WHEN field1 > 0 THEN field1 
     WHEN field1 IS NULL THEN (field2 * field3) 
     ELSE (field2 * field3) 
    END) AS result, 
    field1, field2, field3 

FROM table 
WHERE 
    (CASE 
     WHEN field1 > 0 THEN field1 
     WHEN field1 IS NULL THEN (field2 * field3) 
     ELSE (field2 * field3) 
    END) IS NULL 

它将立即成为apparrent的问题是什么。

0

您可以使用COALESCE/IFNULL (SQL Server/MySQL)

Easy as:

SELECT 
    COALESCE((CASE 
     WHEN field1 > 0 THEN field1 
     ELSE (field2 * field3) 
    END), 0) AS result 
FROM table