Cassandra中CQL WHERE子句用括号为何抛出SyntaxException?
Cassandra CQL SyntaxException:嵌套AND条件括号导致报错的原因
你执行的第一个CQL查询:
SELECT * FROM alarm_history WHERE domain IN ('BAREMETAL','CLOUD','CORE','FIBER','INFRA','PLATFORM','RAN','SECURITY','TRANSPORT') AND ((actual_severity = 'MAJOR') AND (technology = 'LTE')) ALLOW FILTERING;
抛出SyntaxException的核心原因是Cassandra的CQL语法不支持在WHERE子句中使用嵌套括号包裹AND条件组合——哪怕逻辑上和展开后的语句完全等价,语法解析器也无法识别这种结构。
从报错信息line 1:162 mismatched input 'AND' expecting ')'能看出,解析器处理内层括号时,认为第一个)就应该结束条件分组,但你后续又写了AND,导致语法匹配失败。
而移除括号后的查询:
SELECT * FROM alarm_history WHERE domain IN ('BAREMETAL','CLOUD','CORE','FIBER','INFRA','PLATFORM','RAN','SECURITY','TRANSPORT') AND actual_severity = 'MAJOR' AND technology = 'LTE' ALLOW FILTERING;
采用了扁平的条件组合结构,直接用AND连接所有单个条件,完全符合CQL的语法规范,因此可以正常执行。
给Cassandra新手的补充提示
- CQL对WHERE子句的逻辑表达式限制比SQL严格,AND条件无需用括号分组——因为AND是左结合运算符,多个AND条件的执行逻辑和分组后的完全一致。
- 若涉及OR条件,限制会更严格:OR只能用于同一分区键的取值范围查询,或配合IN使用,且不能跨分区键条件组合,这点需要格外注意。
内容的提问来源于stack exchange,提问作者Shantilal Barde
相关产品推荐
相关产品推荐

