我正在为Cassandra工作,试图了解它是如何工作的。使用IN运算符时遇到一些奇怪的东西。例如:
表:
CREATE TABLE test_time (
name text,
age int,
time timeuuid,
"timestamp" timestamp,
PRIMARY KEY ((name, age), time)
)
我插入了一些虚拟数据。使用IN运算符如下:
SELECT * from test_time
where name="9" and age=81
and time IN (c7c88000-190e-11e4-8000-000000000000, c7c88000-190e-11e4-7000-000000000000);
它运作正常。
然后,添加了Map
类型的列。表格如下:
CREATE TABLE test_time (
name text,
age int,
time timeuuid,
name_age map<text, int>,
"timestamp" timestamp,
PRIMARY KEY ((name, age), time)
)
在执行相同的查询时,我收到以下错误:
错误请求:当查询选择了集合时,无法通过IN关系限制PRIMARY KEY兼职
从上面的例子中,我们可以说,如果表中有任何类型集合(Map或List)列,IN运算符就不起作用。
我不明白为什么它会像这样。请告诉我如果我在这里遗漏了什么。提前谢谢。
答案 0 :(得分:4)
select * from ...where name='9' and age=81 and time > x and time < y
select [columns except collection] from ...where name='9' and age=81 and time in (...)
然后,您可以过滤客户端,或进行其他查询。
答案 1 :(得分:0)
您可以将列作为主键
中分区表达式的一部分CREATE TABLE test_time (
name text,
age int,
time timeuuid,
"timestamp" timestamp,
PRIMARY KEY ((name, time), age)
);
或创建单独的Materialized View以满足您的查询要求:
CREATE MATERIALIZED VIEW test_time_mv AS
SELECT * FROM test_time
WHERE name IS NOT NULL AND time IS NOT NULL AND age IS NOT NULL
PRIMARY KEY ((name, time), age);
现在在查询中使用实体化视图而不是基表:
SELECT * from test_time_mv
where name='9'
and age=81
and time IN (c7c88000-190e-11e4-8000-000000000000,
c7c88000-190e-11e4-7000-000000000000);