2014-10-14 3 views
2

В Кассандре, за столом, как этотВозможно ли использовать сложную логическую логику в запросе CQL?

CREATE TABLE test.TestTable3 (
    PK1 int, 
    PK2 int, 
    CK3 int, 
    CK4 int, 
    CK5 text, 
    CK6 int, 
    CK7 int, 
    Dump text, 
    PRIMARY KEY ((PK1,PK2,CK3),CK4,CK5,CK6,CK7) 
); 

Как сделать что-то запрос, как например, с использованием или с частичной или

Select * from testtable3 where Pk1=1 and Pk2=2 and Ck3 =2 and Ck4 =4 and ((CK=5 ="ABC" 
and CK6=1) or (CK=5 ="BBC" and CK6=1)) 

относительно

ответ

3

Прежде всего, позвольте мне сказать, что Кассандра не поддерживает сложные, специальные запросы. Язык запросов 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. Я понятия не имею, будет ли это работать с вашим общим приложением или данными, поэтому возьмите его за то, что он стоит.

Смежные вопросы