CQL3是否支持嵌套AND和OR

时间:2016-04-06 12:50:51

标签: cassandra cql cql3

给出此示例表模式:

CREATE TABLE foo (
 pk1 text,
 pk2 text,
 pk3 text,
 pk4 text,
 data map<text, text>,
 PRIMARY KEY ((pk1, pk2, pk3), pk4)
);

我想知道是否可以让查询选择pk2, pk3, pk4与固定pk1的不同组合。类似的东西:

SELECT * FROM foo WHERE pk1 = 'abc' AND 
((pk2 = 'x' AND pk3 = 'y' AND pk4 = 'z') OR ((pk2 = 'd' AND pk3 = 'e' AND pk4 = 'f'));

我不能让这个工作。我有一组pk2, pk3, pk4元组和一个固定的pk1,如果可能的话,想要使用单个查询选择所有匹配的行(Cassandra 2.2.x)。

2 个答案:

答案 0 :(得分:2)

  

我想知道是否有可能有一个查询选择pk2,pk3,pk4与固定pk1的不同组合。

不,不是。

正如Doan指出的那样,OR尚不支持。这会让您AND,这使得嵌套WHERE条件变得多余。

此外,也不支持在AND部分周围添加parens。如果没有parens,这可行,但不适用于它们:

aploetz@cqlsh:stackoverflow> SELECT * FROM row_historical_game_outcome_data
WHERE customer_id=123123 AND (game_id=673 AND game_time = '2015-07-01 05:01:42+0000');

SyntaxException: <ErrorMessage code=2000 [Syntax error in CQL query] message="line 1:89 missing ')' at 'AND' (...=123123 AND (game_id=673 [AND] game_time...)">

话虽这么说,IN谓词将适用于最后一个分区或最后一个群集密钥。但是在分区键上使用它被认为是反模式。无论如何,在你的情况下,这将起作用(语法上):

SELECT * FROM foo WHERE pk1 = 'abc' AND pk2 = 'x' AND pk3 = 'y' AND pk4 IN ('z','f');

答案 1 :(得分:1)

CQL支持列

上的 AND 谓词
  • 属于PRIMARY KEY
  • 由二级索引系统索引
不支持

OR 谓词。它将作为新 SASI secondary index

的未来增强功能得到支持