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

问题描述 投票:0回答:2

我使用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

我的查询有问题吗?

mysql sql null case
2个回答
1
投票

如果没有分支匹配,则CASE表达式将评估为NULL。添加一个ELSE分支到你的CASE,以解释它是完全不同的情况,你的NULLs应该消失。

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

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)
© www.soinside.com 2019 - 2024. All rights reserved.