Прежде всего, позвольте мне сказать, что Кассандра не поддерживает сложные, специальные запросы. Язык запросов Cassandra (CQL) - это подмножество (а не реализация) SQL. Поэтому вы не можете делать все на CQL, которые могут работать в SQL.
Во-вторых, CQL не поддерживает оператора OR
. Однако в некоторых случаях вы можете использовать оператор IN
. По существу, IN
работает только с ключом секционирования. И только по последнему ключу секционирования, если вы используете составной ключ разделения (как и вы). Однако следует предупредить, что, поскольку Cassandra предназначена для чтения сообщений по конкретным первичным ключевым запросам, не рекомендуется полагаться на использование IN
. См. SELECT: When not to use IN для получения дополнительной информации.
В-третьих, в отличие от реляционной базы данных, в Кассандре хорошей практикой является денормализация/репликация ваших данных при построении ее на несколько таблиц для поддержки каждого желаемого запроса. При том, что в-уме, вы можете создать таблицу запроса, как это:
CREATE TABLE TestTable4 (
PK1 int,
PK2 int,
CK3 int,
CK4 int,
CK5 text,
CK6 int,
CK7 int,
Dump text,
PRIMARY KEY ((PK1,PK2,CK3,CK4,CK6,CK5),CK7)
);
Обратите внимание, как я расширил ключ раздела, и изменил порядок CK5
и CK6
. С учетом этой структуры таблицы, этот запрос работает:
[email protected]:stackoverflow> SELECT * FROM testtable4 WHERE pk1=1 AND pk2=2 AND ck3=3
... AND ck4=4 AND ck6=1 AND ck5 IN ('ABC','BBC');
pk1 | pk2 | ck3 | ck4 | ck6 | ck5 | ck7 | dump
-----+-----+-----+-----+-----+-----+-----+---------
1 | 2 | 3 | 4 | 1 | ABC | 7 | row ABC
1 | 2 | 3 | 4 | 1 | BBC | 7 | row BBC
(2 rows)
Примечание: Я использовал эту структуру, чтобы показать вам, как на основе запроса-моделирования работы Cassandra. Я понятия не имею, будет ли это работать с вашим общим приложением или данными, поэтому возьмите его за то, что он стоит.