Поддерживает ли CQL3 вложенные AND и OR?

Учитывая эту примерную схему таблицы:

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

2 ответа

Решение

Интересно, возможно ли иметь запрос, который выбирает различные комбинации pk2, pk3, pk4 с фиксированным pk1.

Нет.

Как указал Доан, OR не поддерживается (пока). Это оставляет вас с AND который делает вложение WHERE условия лишние.

Кроме того, добавляя паренсы вокруг вашего AND запчасти тоже не поддерживаются. Без паренов это работает, но не с ними:

aploetz@cqlsh:stackru> 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');

CQL поддерживает предикат AND для столбцов

  • которые принадлежат PRIMARY KEY
  • которые индексируются вторичной индексной системой

ИЛИ предикат не поддерживается. Это будет поддерживаться как дальнейшее улучшение нового вторичного индекса SASI.

Другие вопросы по тегам