是否可以在CQL查询中使用复杂的布尔逻辑?

时间:2014-10-14 07:14:08

标签: cassandra cql

在cassandra中,对于像这样的表

CREATE TABLE test.TestTable3 (
   PK1 int,
   PK2 int,
   CK3 int,
   CK4 int,
   CK5 text,
   CK6 int,
   CK7 int,
   Dump text,
   PRIMARY KEY ((PK1,PK2,CK3),CK4,CK5,CK6,CK7)
);

如何查询,例如使用或使用partial或

Select * from testtable3 where Pk1=1 and Pk2=2 and Ck3 =2 and Ck4 =4 and (( CK=5 ="ABC" 
and  CK6=1) or ( CK=5 ="BBC" and CK6=1))

问候

1 个答案:

答案 0 :(得分:3)

首先,我只想说Cassandra不支持复杂的即席查询。 Cassandra查询语言(CQL)是SQL的子集(不是实现)。因此,您无法在CQL中执行可能在SQL中工作的所有内容。

其次,CQL不支持OR运算符。但是,在某些情况下,您可以使用IN运算符。实质上,IN仅适用于分区键。并且仅在最后一个分区键上,如果使用复合分区键(就像您一样)。但请注意,由于Cassandra旨在提供对特定主键查询的读取,因此不建议依赖IN的使用。有关详细信息,请参阅SELECT: When not to use IN

第三,与关系数据库不同,在Cassandra中,优化实例是对数据进行非规范化/复制,同时将其构建到多个表中以支持每个所需的查询。考虑到这一点,您可以创建一个这样的查询表:

CREATE TABLE TestTable4 (
   PK1 int,
   PK2 int,
   CK3 int,
   CK4 int,
   CK5 text,
   CK6 int,
   CK7 int,
   Dump text,
   PRIMARY KEY ((PK1,PK2,CK3,CK4,CK6,CK5),CK7)
);

请注意我是如何扩展分区键的,并更改了CK5CK6的顺序。给定此表结构,此查询有效:

aploetz@cqlsh:stackoverflow> SELECT * FROM testtable4 WHERE pk1=1 AND pk2=2 AND ck3=3
              ... AND ck4=4 AND ck6=1 AND ck5 IN ('ABC','BBC');

 pk1 | pk2 | ck3 | ck4 | ck6 | ck5 | ck7 | dump
-----+-----+-----+-----+-----+-----+-----+---------
   1 |   2 |   3 |   4 |   1 | ABC |   7 | row ABC
   1 |   2 |   3 |   4 |   1 | BBC |   7 | row BBC

(2 rows)

注意:我使用此结构向您展示Cassandra基于查询的建模是如何工作的。我不知道这是否适用于您的整体应用程序或数据,因此请考虑它的价值。