2016-04-06 9 views
1

dieses Beispieltabellenschema Gegeben:Does CQL3 Unterstützung verschachtelt AND und OR

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

Ich frage mich, ob es möglich ist, eine Abfrage zu haben, die verschiedenen Kombinationen von pk2, pk3, pk4 mit einer festen pk1 auswählt. Etwas wie:

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

Ich bekomme das nicht funktioniert. Ich habe eine Reihe von pk2, pk3, pk4 Tupel und eine feste pk1 und möchten alle passenden Zeilen mit einer einzigen Abfrage wenn möglich (Cassandra 2.2.x) auswählen.

Antwort

2

Ich frage mich unterstützt werden, wenn es möglich ist, eine Abfrage zu haben, die verschiedenen Kombinationen von pk2, pk3, pk4 mit einem festen PK1 auswählt.

Nein, ist es nicht.

Wie Doan darauf hinwies, wird OR (noch) nicht unterstützt. Dies lässt Sie mit AND, die Verschachtelung WHERE Bedingungen überflüssig macht.

Auch das Hinzufügen von Parens um Ihre Teile wird ebenfalls nicht unterstützt. Ohne Pars funktioniert das, aber nicht mit ihnen:

[email protected]: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...)"> 

aber sagen, dass das IN Prädikat entweder auf der letzten Partition oder letzte Clustering-Schlüssel funktioniert. Aber es auf einem Partitionsschlüssel zu verwenden, wird als ein Anti-Pattern betrachtet. Auf jeden Fall in Ihrem Fall würde dies funktionieren (syntaktisch):

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

CQL unterstützt UND Prädikat auf Säulen

  • die PRIMARY KEY
  • zu dem gehören, die
  • durch das sekundäre Indexsystem indiziert sind

OR Prädikat wird nicht unterstützt. Es wird als zukünftige Erweiterung der neuen SASI secondary index

+0

Ok ich denke, das erklärt, warum es nicht eine '.or' Methode in der' QueryBuilder' des DataStax-Fahrer war :) – reikje