我试图查询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...
如何正确编写此查询?
答案 0 :(得分:0)
根据我的回答阅读你的评论后,我在官方文档中也注意到你可以使用元组来表示IN
条款。但这仅适用于群集列。这意味着以下示例将起作用,因为namespace
和name
列在我的表定义中都是群集列(请参阅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')
Here是IN
过滤器