通过列表中的列对查询Cassandra

时间:2018-04-09 09:54:45

标签: cassandra cassandra-3.0

我试图查询Cassandra(3.2)中的任何一行,其中一对两列应该等于下表中对列表中的任何条目:

CREATE TABLE dataset (
    bucket int,
    namespace text,
    name text,
    data text,
    PRIMARY KEY ((bucket), namespace, name)
);

SELECT documentation我可以看出,我应该可以使用relation群集过滤器。不幸的是,文档因为没有正确匹配括号和括号而使事情相当混乱,但我觉得它告诉我以下内容应该有效:

SELECT namespace, name, data FROM dataset
WHERE id = 12345 AND (namespace, name) IN (namespace1, Peter),(namespace2, Clark)

然而,事实并非如此:

SELECT namespace, name, data FROM dataset
WHERE id = 12345 AND (namespace, name) IN ((namespace1, Peter),(namespace2, Clark))

查询均以...no viable alternative at input...

失败

如何正确编写此查询?

1 个答案:

答案 0 :(得分:0)

根据我的回答阅读你的评论后,我在官方文档中也注意到你可以使用元组来表示IN条款。但这仅适用于群集列。这意味着以下示例将起作用,因为namespacename列在我的表定义中都是群集列(请参阅PRIMARY KEY部分):

CREATE TABLE dataset (
    bucket int,
    namespace text,
    name text,
    data text,
    PRIMARY KEY ((bucket), namespace, name)
);

SELECT * FROM dataset WHERE bucket = 1 AND (namespace, name) IN (('namespace1', 'Peter'), ('namespace2', 'Clark'));

如果更改以下表格定义,上面的查询将返回错误:

CREATE TABLE dataset (
    namespace text,
    name text,
    data text,
    PRIMARY KEY (namespace, name)
);

您可以阅读有关群集列here的更多信息。

尝试使用以下CQL命令

SELECT namespace, name, data FROM dataset
WHERE id = 12345 AND namespace = 'dummy' AND name IN ('Peter', 'Clark')

HereIN过滤器

的官方文档