给出此示例表模式:
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)。
答案 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)