如何在cassandra中查询!= null列。
Select * from tableA where id != null;
Select * from tableA where name != null;
然后我想存储这些值并将它们插入到不同的表中。
答案 0 :(得分:12)
我不认为Cassandra可以做到这一点。首先,Cassandra CQL不支持在WHERE子句中使用NOT或不等于运算符。其次,WHERE子句只能包含主键列,主键列不允许插入空值。我不确定二级索引,所以我运行了这个快速测试:
create table nullTest (id text PRIMARY KEY, name text);
INSERT INTO nullTest (id,name) VALUES ('1','bob');
INSERT INTO nullTest (id,name) VALUES ('2',null);
我现在有一个表和两行(一行有空数据):
SELECT * FROM nullTest;
id | name
----+------
2 | null
1 | bob
(2 rows)
然后我尝试在name上创建一个二级索引,我知道它包含空值。
CREATE INDEX nullTestIdx ON nullTest(name);
它让我做到了。现在,我将对该索引运行查询。
SELECT * FROM nullTest WHERE name=null;
Bad Request: Unsupported null value for indexed column name
同样,如果您甚至无法查询实际可能为null的列值,则可以在不能查询非null的前提下完成此操作。
所以,我认为这不可能做到。此外,如果主键中存在空值,则可能需要重新评估数据模型。同样,我知道OP的问题是查询数据不 null的位置。但正如我之前提到的,Cassandra CQL没有NOT或!=运算符,所以这就是问题所在。
另一种选择是插入一个空字符串而不是null。然后,您就可以查询空字符串。但是,这仍然没有让你超越在主键字段中使用null的基本设计缺陷。也许如果你有一个复合主键,只有一部分(聚类列)有可能是空的(当然不是分区键的一部分)。但是你仍然会遇到无法查询“非空”(而非非空)行的问题。
注意:此处仅插入空值以用于演示目的。这是你应该尽力避免的事情,因为插入空列值将创建一个墓碑。同样,插入大量空值会产生大量的墓碑。
答案 1 :(得分:3)
1)从测试中选择*;
name | id | address
------------------+----+------------------
bangalore | 3 | ramyam_lab
bangalore | 4 | bangalore_ramyam
bangalore | 5 | jasgdjgkj
prasad | 11 | null
prasad | 12 | null
india | 6 | karnata
india | 7 | karnata
ramyam-bangalore | 3 | jasgdjgkj
ramyam-bangalore | 5 | jasgdjgkj
2)cassandra不支持空值选择。我们的理解显示为null。
3)对于处理空值,使用另一个字符串,如“not-available”,“null”,然后我们可以选择数据