在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))
问候
答案 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)
);
请注意我是如何扩展分区键的,并更改了CK5
和CK6
的顺序。给定此表结构,此查询有效:
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基于查询的建模是如何工作的。我不知道这是否适用于您的整体应用程序或数据,因此请考虑它的价值。