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 支持 AND 列上的谓词
- 属于
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');
给定此示例 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 支持 AND 列上的谓词
- 属于
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');