Поддерживает ли 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.