2016-04-06 4 views
1

ネストされたこのサンプルのテーブルスキーマを考える:んCQL3のサポートは、ANDとOR

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

固定pk1pk2, pk3, pk4の異なる組み合わせを選択するクエリを持つことが可能である場合、私は疑問に思います。次のようなものがあります。

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)。

答えて

2

の将来の拡張としてサポートされます。

いいえ、そうではありません。

Doanが指摘したように、ORはサポートされていません(まだ)。これにより、ANDが残され、WHEREのネストが不要になります。

また、ANDの部分の周囲に括弧を追加することもサポートされていません。括弧がなければ、これは彼らと一緒に動作しますが、ない:

言われていること
[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...)"> 

IN述語が最後のパーティションまたは最後のクラスタ化キーのいずれかで動作します。しかし、それをパーティションキーで使用することは、アンチパターンとみなされます。いずれにせよ、あなたの場合、これは(構文的に)動作します:

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

CQLは

OR述語がサポートされていないセカンダリインデックスシステムによってインデックス付けされるPRIMARY KEY

  • に属している列

    • 述語をサポートしています。一定のPK1とPK2、PK3、PK4の異なる組み合わせを選択するクエリを持つことが可能である場合、私は疑問に思う新しいSASI secondary index

  • +0

    私はdatastax-driverの ' – reikje

    関連する問題