在cassandra中选择id!= null

时间:2014-06-27 16:03:05

标签: cassandra cql

如何在cassandra中查询!= null列。

Select * from tableA where id != null;
Select * from tableA where name != null;

然后我想存储这些值并将它们插入到不同的表中。

2 个答案:

答案 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”,然后我们可以选择数据