ScyllaDB 是否支持 OR 运算符?

Gop*_*opi 3 cassandra nosql scylla

scyladb 中 SELECT 语句的 WHERE 子句中的 OR 条件如何工作。

我已经在电子邮件上创建了二级索引。下面的查询工作正常并返回结果。

cqlsh> select * from test.d_emp where email='robs@ex.com';

 id  | dept | email       | first_name | last_name | salary
-----+------+-------------+------------+-----------+--------
  10 |   10 | robs@ex.com |        Rob |     Stark |   1000
   1 |   10 | robs@ex.com |        Rob |     Stark |   1000
 101 |   10 | robs@ex.com |        Rob |     Stark |   1000

(3 rows)
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用 OR 运算符使用两个条件,则会出现语法错误。即使简单的 1=1 也会给出同样的错误。

cqlsh> select * from test.d_emp where email='robs@ex.com' or email='robs@ex';
SyntaxException: line 1:51  : syntax error...

cqlsh>

cqlsh> select * from test.d_emp where email='robs@ex.com' or 1=1;
SyntaxException: line 1:51  : syntax error...

cqlsh>

Run Code Online (Sandbox Code Playgroud)

请帮助我了解如何在 Scylladb 的 where 子句中组合多个条件。

Nad*_*'El 5

CQL(Cassandra 查询语言,也由 ScyllaDB 实现)没有通用的“OR”关键字(请参阅问题#12910 - 仅支持“AND”)。错误消息本来可以而且应该更友好(请参阅问题#1703),但最终告诉您正确的事情 - 这是一个语法错误 - 或者不是合法的 CQL 语法。

在您的用例中where email='robs@ex.com' or email='robs@ex',解决方案很简单 - 只需使用 IN 关键字:where email IN ('robs@ex.com', 'robs@ex')

顺便说一句,该1=1部分也不起作用,即使没有 OR 也不起作用,因为当前 CQL 表达式的范围相当有限,在本例中column=value是一个有效的表达式,但value=value或其他东西则不是。问题#12906是改进这一点的一个步骤,但对于您的用例,您并不真正需要它(您并不真正1=1想在表达式中使用)。

  • 很好的答案!我本来想对“IN”关键字说同样的话。 (2认同)