CnosDB v2.4.0中如何使用简化布尔值t|f进行查询?
CnosDB v2.4.0 BOOLEAN类型查询与插入行为不一致问题解决
问题现象
使用CnosDB v2.4.0时,BOOLEAN类型文档标注支持{true | false | t | f}语法,但实际操作中存在明显行为不一致:
- 插入数据时,字符串形式的
't'可被隐式转换为布尔值true成功写入,但裸写t会触发字段不存在的报错; - 查询数据时,无论是用
't'还是裸写t都无法匹配布尔字段,分别触发类型不兼容或字段不存在错误,仅标准布尔值true/false能正常查询。
复现操作
插入语句
-- 创建表 CREATE TABLE table_a(is_conv boolean, tags(ta)); -- 标准布尔值插入,成功 INSERT INTO table_a(time, ta, is_conv) VALUES (now(), 'r1', true); -- 结果: -- +------+ -- | rows | -- +------+ -- | 1 | -- +------+ -- 裸写t插入,报错 INSERT INTO table_a(time, ta, is_conv) VALUES (now(), 'r2', t); -- 错误:422 Unprocessable Entity, details: {"error_code":"010001","error_message":"Datafusion: Schema error: No field named t."} -- 字符串't'插入,成功 INSERT INTO table_a(time, ta, is_conv) VALUES (now(), 'r2', 't'); -- 结果: -- +------+ -- | rows | -- +------+ -- | 1 | -- +------+ -- 查询验证,两条数据is_conv均为true SELECT * FROM table_a; -- +-------------------------------+----+---------+ -- | time | ta | is_conv | -- +-------------------------------+----+---------+ -- | 2024-01-06T19:02:46.880107100 | r1 | true | -- | 2024-01-06T19:02:56.199697400 | r2 | true | -- +-------------------------------+----+---------+
查询语句
-- 标准布尔值查询,成功 SELECT * FROM table_a WHERE is_conv = true; -- +-------------------------------+----+---------+ -- | time | ta | is_conv | -- +-------------------------------+----+---------+ -- | 2024-01-06T19:02:46.880107100 | r1 | true | -- | 2024-01-06T19:02:56.199697400 | r2 | true | -- +-------------------------------+----+---------+ -- 字符串't'查询,类型不兼容报错 SELECT * FROM table_a WHERE is_conv = 't'; -- 错误:422 Unprocessable Entity, details: {"error_code":"010001","error_message":"Datafusion: type_coercion\ncaused by\nError during planning: Boolean = Utf8 can't be evaluated because there isn't a common type to coerce the types to"} -- 裸写t查询,字段不存在报错 SELECT * FROM table_a WHERE is_conv = t; -- 错误:422 Unprocessable Entity, details: {"error_code":"010001","error_message":"Datafusion: Schema error: No field named t. Valid fields are table_a.time, table_a.ta, table_a.is_conv."} -- 双引号"t"查询,同样被识别为字段名报错 SELECT * FROM table_a WHERE is_conv = "t"; -- 错误:422 Unprocessable Entity, details: {"error_code":"010001","error_message":"Datafusion: Schema error: No field named t. Valid fields are table_a.time, table_a.ta, table_a.is_conv."}
原因分析
- 插入隐式转换局限:CnosDB仅在插入阶段对字符串
t/f做隐式布尔转换,该逻辑未覆盖查询流程; - 查询解析规则:查询时裸写的
t会被解析为字段名而非布尔常量,字符串't'则被视为UTF8类型,无法与布尔字段直接比较; - 文档描述偏差:当前版本未实现将裸写
t/f解析为布尔常量的功能,文档标注存在与实际实现不符的情况。
解决方案
- 标准布尔值优先:查询和插入统一使用
true/false,这是最稳定且符合SQL标准的方式; - 显式类型转换(可选):若需使用简化形式查询,通过
CAST函数转换类型:SELECT * FROM table_a WHERE is_conv = CAST('t' AS BOOLEAN); - 插入规范:避免依赖隐式转换,直接用
true/false写入布尔值,减少兼容性风险。
内容的提问来源于stack exchange,提问作者Darts
相关产品推荐
相关产品推荐

