我使用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
我的查询出问题了吗?
答案 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)