在SELECT子句中使用IN子查询时,NULL与非结果集中的值都会返回NULL
我在使用Apache IoTDB 2.0.6的表格模型来实现数据筛选功能,在该功能中我需要标记每条记录是否属于某个特定类别。例如,我想检查每个产品的价格是否在“类别A”产品的价格清单中。
原始数据
CREATE TABLE products (product_id STRING Tag, category STRING Tag, price INT32 Field);
INSERT INTO products(`time`, product_id, category, price) VALUES (2024-09-24T14:00:00.000+08:00, 'p01', 'A', 100);
INSERT INTO products(`time`, product_id, category, price) VALUES (2024-09-24T14:01:00.000+08:00, 'p01', 'A', 200);
INSERT INTO products(`time`, product_id, category, price) VALUES (2024-09-24T14:02:00.000+08:00, 'p01', 'A', `NULL`);
INSERT INTO products(`time`, product_id, category, price) VALUES (2024-09-24T14:03:00.000+08:00, 'p02', 'B', 150);
查询SQL
SELECT product_id, price,
price IN (
SELECT price
FROM products
WHERE category = 'A') AS is_in_category
FROM products;
返回结果
| 产品ID | 价格 | 是否在类别中 |
|---|---|---|
| p01 | 100 | true |
| p02 | 150 | null |
| p01 | 200 | true |
| p01 | null |
null |
遇到的问题
- 当p01的价格等于
NULL时,它返回null,但子查询包含一个NULL值——难道不应该返回true吗? - p02的价格150显然不在子查询结果集(100、200、
NULL)中,但它返回null而不是false
期望结果
| 产品ID | 价格 | 是否在类别中 |
|---|---|---|
| p01 | 100 | true |
| p01 | 200 | true |
| p01 | null |
true |
| p02 | 150 | false |
这是IoTDB的一个bug吗?如果不是,我应该如何调整我的SQL语句?
解决方案
我建议直接检查price是否为null的存在性:
SELECT product_id, price,
CASE WHEN price IS NOT NULL THEN
CASE WHEN EXISTS (SELECT price FROM products p2
WHERE category = 'A' AND p2.price = p.price) THEN true
ELSE false
END
ELSE
CASE WHEN EXISTS (SELECT price FROM products p2
WHERE category = 'A' AND p2.price IS NULL) THEN true
ELSE false
END
END AS is_in_category
FROM products p;
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。