2016-04-06 2 views
1

Compte tenu de ce tableau exemple schéma:pris en charge par CQL3 imbriqué ET et OU

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

Je me demande s'il est possible d'avoir une requête qui sélectionne différentes combinaisons de pk2, pk3, pk4 avec un pk1 fixe. Quelque chose comme:

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

Je ne comprends pas cela. J'ai un ensemble de tuples pk2, pk3, pk4 et un fixe pk1 et je veux sélectionner toutes les lignes correspondantes en utilisant une seule requête si possible (Cassandra 2.2.x).

Répondre

2

Je me demande s'il est possible d'avoir une requête qui sélectionne différentes combinaisons de PK2, PK3, PK4 avec un PK1 fixe.

Non, ce n'est pas le cas.

Comme Doan l'a souligné, OR n'est pas encore supporté. Cela vous laisse avec AND ce qui rend l'emboîtement WHERE des conditions superflues.

De plus, l'ajout de parens autour de vos pièces AND n'est pas supporté non plus. Sans parens cela fonctionne, mais pas avec eux:

[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...)"> 

Cela étant dit, le IN prédicat fonctionnera soit sur la dernière partition ou la dernière clé de cluster. Mais l'utiliser sur une clé de partition est considéré comme un anti-pattern. Dans tous les cas, dans votre cas cela fonctionnerait (syntaxiquement):

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

CQL soutient ET prédicats sur les colonnes

  • qui appartiennent au PRIMARY KEY
  • qui sont indexés par le système d'index secondaire

OU prédicat est pas pris en charge. Il sera soutenu que l'amélioration future de la nouvelle SASI secondary index

+0

Ok je suppose que cela explique pourquoi il n'y avait pas une méthode '' .or' dans le QueryBuilder' du DataStax-pilote :) – reikje