已经使用IS NULL函数,但仍返回NULL值

时间:2019-04-30 08:40:07

标签: mysql sql null case

我使用CASE WHEN创建查询,并使用IS NULL函数在1个CASE中声明状态。但是查询结果仍然返回NULL值。

下面是我的查询

SELECT 
    CASE
        WHEN SUBSTRING_INDEX(SUBSTRING_INDEX(B.failure_detail, '"remark":"', -1), '"', 1) = 'Customer membatalkan pesanan' THEN 'Customer canceling order'
        WHEN SUBSTRING_INDEX(SUBSTRING_INDEX(B.failure_detail, '"remark":"', -1), '"', 1) = 'Deskripsi dalam order tidak sama' THEN 'Description not match'        
        WHEN SUBSTRING_INDEX(SUBSTRING_INDEX(B.failure_detail, '"remark":"', -1), '"', 1) = 'Barang rusak' THEN 'Item defective'
        WHEN SUBSTRING_INDEX(SUBSTRING_INDEX(B.failure_detail, '"remark":"', -1), '"', 1) = 'Salah satu barang rusak' THEN 'Partially defective'
        WHEN SUBSTRING_INDEX(SUBSTRING_INDEX(B.failure_detail, '"remark":"', -1), '"', 1) = 'Salah satu stok tidak tersedia' THEN 'Partially not available'
        WHEN SUBSTRING_INDEX(SUBSTRING_INDEX(B.failure_detail, '"remark":"', -1), '"', 1) = 'Stok tidak tersedia' THEN 'Stock not available'
        WHEN SUBSTRING_INDEX(SUBSTRING_INDEX(B.failure_detail, '"remark":"', -1), '"', 1) = 'Order tidak bisa di scan' THEN 'Cannot scan order'
        WHEN SUBSTRING_INDEX(SUBSTRING_INDEX(B.failure_detail, '"remark":"', -1), '"', 1) = 'Order belum dibayar' THEN 'Order not paid'
        WHEN b.failure_detail IS NULL THEN 'Fulfillment Timeout'
    END AS 'Cancellation Remarks',
    COUNT(*) as 'Total'
FROM
    deli_order A
INNER JOIN
    deli_order_store B ON B.deli_order_id = A.id
WHERE
    (DATE(A.plat_create_time) BETWEEN '2019-04-21' AND '2019-04-27') AND 
    (A.status = 8) AND 
    (A.pay_state = 1) AND 
    NOT EXISTS (
        SELECT 1
        FROM deli_order AS B
        WHERE B.order_code = A.order_code
        AND B.code = A.code
        AND B.status = 6)
GROUP BY
    CASE
        WHEN SUBSTRING_INDEX(SUBSTRING_INDEX(B.failure_detail, '"remark":"', -1), '"', 1) = 'Customer membatalkan pesanan' THEN 'Customer canceling order'
        WHEN SUBSTRING_INDEX(SUBSTRING_INDEX(B.failure_detail, '"remark":"', -1), '"', 1) = 'Deskripsi dalam order tidak sama' THEN 'Description not match'        
        WHEN SUBSTRING_INDEX(SUBSTRING_INDEX(B.failure_detail, '"remark":"', -1), '"', 1) = 'Barang rusak' THEN 'Item defective'
        WHEN SUBSTRING_INDEX(SUBSTRING_INDEX(B.failure_detail, '"remark":"', -1), '"', 1) = 'Salah satu barang rusak' THEN 'Partially defective'
        WHEN SUBSTRING_INDEX(SUBSTRING_INDEX(B.failure_detail, '"remark":"', -1), '"', 1) = 'Salah satu stok tidak tersedia' THEN 'Partially not available'
        WHEN SUBSTRING_INDEX(SUBSTRING_INDEX(B.failure_detail, '"remark":"', -1), '"', 1) = 'Stok tidak tersedia' THEN 'Stock not available'
        WHEN SUBSTRING_INDEX(SUBSTRING_INDEX(B.failure_detail, '"remark":"', -1), '"', 1) = 'Order tidak bisa di scan' THEN 'Cannot scan order'
        WHEN SUBSTRING_INDEX(SUBSTRING_INDEX(B.failure_detail, '"remark":"', -1), '"', 1) = 'Order belum dibayar' THEN 'Order not paid'
        WHEN b.failure_detail IS NULL THEN 'Fulfillment Timeout'
    END;

这是我查询的结果

Cancellation Remarks | Total
NULL                    35
Description not match    1
Fulfillment Timeout     19
Item defective           6
Stock not available     13

我的查询出问题了吗?

2 个答案:

答案 0 :(得分:1)

如果没有一个分支匹配,则CASE表达式的值为NULL。在您的ELSE上添加一个CASE分支,以解决完全不同的情况,而您的NULL应该消失了。

CASE
    WHEN SUBSTRING_INDEX(SUBSTRING_INDEX(B.failure_detail, '"remark":"', -1), '"', 1) = 'Customer membatalkan pesanan' THEN 'Customer canceling order'
    WHEN SUBSTRING_INDEX(SUBSTRING_INDEX(B.failure_detail, '"remark":"', -1), '"', 1) = 'Deskripsi dalam order tidak sama' THEN 'Description not match'        
    WHEN SUBSTRING_INDEX(SUBSTRING_INDEX(B.failure_detail, '"remark":"', -1), '"', 1) = 'Barang rusak' THEN 'Item defective'
    WHEN SUBSTRING_INDEX(SUBSTRING_INDEX(B.failure_detail, '"remark":"', -1), '"', 1) = 'Salah satu barang rusak' THEN 'Partially defective'
    WHEN SUBSTRING_INDEX(SUBSTRING_INDEX(B.failure_detail, '"remark":"', -1), '"', 1) = 'Salah satu stok tidak tersedia' THEN 'Partially not available'
    WHEN SUBSTRING_INDEX(SUBSTRING_INDEX(B.failure_detail, '"remark":"', -1), '"', 1) = 'Stok tidak tersedia' THEN 'Stock not available'
    WHEN SUBSTRING_INDEX(SUBSTRING_INDEX(B.failure_detail, '"remark":"', -1), '"', 1) = 'Order tidak bisa di scan' THEN 'Cannot scan order'
    WHEN SUBSTRING_INDEX(SUBSTRING_INDEX(B.failure_detail, '"remark":"', -1), '"', 1) = 'Order belum dibayar' THEN 'Order not paid'
    WHEN b.failure_detail IS NULL THEN 'Fulfillment Timeout'
    ELSE 'Something completely different'
END

答案 1 :(得分:0)

仅通过示例扩展@sticky位答案

MariaDB [sandbox]> select id,password from users;
+------+----------+
| id   | password |
+------+----------+
|    1 | NULL     |
|    2 | NULL     |
|    3 | zzz      |
|    4 | NULL     |
|  999 | NULL     |
| 1000 | NULL     |
| 1001 | NULL     |
+------+----------+
7 rows in set (0.00 sec)

MariaDB [sandbox]>
MariaDB [sandbox]> select case
    ->  when password = 'abc' then 'found'
    ->   when password is null then 'notfound'
    ->  end as pfound,
    -> count(*)
    -> from users
    -> group by
    -> case
    ->  when password = 'abc' then 'found'
    ->   when password is null then 'notfound'
    ->    end;
+----------+----------+
| pfound   | count(*) |
+----------+----------+
| NULL     |        1 |
| notfound |        6 |
+----------+----------+
2 rows in set (0.00 sec)