在SELECT子句中使用IN子查询时,NULL与非结果集中的值都会返回NULL

编程语言 2026-07-09

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

遇到的问题

  1. 当p01的价格等于 NULL 时,它返回 null,但子查询包含一个 NULL 值——难道不应该返回true吗?
  2. 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;

Fiddle演示

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章