CQL3是否支持嵌套的AND和OR

Does CQL3 support nested AND and OR

给定此示例 table 架构:

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

我想知道是否可以查询 select 的 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 并且希望 select 如果可能的话使用单个查询(Cassandra 2.2.x)所有匹配的行。

CQL 支持 A​​ND 列上的谓词

  • 属于PRIMARY KEY
  • 被二级索引系统索引
不支持

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

的未来增强得到支持

I wonder if it is possible to have a query that selects different combinations of pk2, pk3, pk4 with a fixed pk1.

不,不是。

正如 Doan 指出的那样,OR 还不受支持。这给您留下了 AND,这使得嵌套 WHERE 条件变得多余。

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

aploetz@cqlsh:Whosebug> 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 谓词将对最后一个分区或最后一个集群键起作用。但是在分区键上使用它被认为是 anti-pattern。无论如何,在你的情况下这会起作用(语法上):

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