2014-06-27 108 views
8

如何在cassandra中查询!= null列。SELECT in cassandra where id!= null

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

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

+0

'其中id是null'? 'null'是数据库中的一个特殊值,具有传染性。任何使用null执行的操作都会“受到感染”,并且结果变得无效。你不能'null = null',并且必须使用特殊的'is null'语法。 –

+0

将选择* from tableA where id = null; – user3780281

+0

'其中id不为空'。 –

回答

6

我不认为这是可能的与卡桑德拉。首先,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) 

然后我试着在名称上创建一个二级索引,我知道它包含空值。

CREATE INDEX nullTestIdx ON nullTest(name); 

它让我这样做。现在,我将对该索引运行查询。

SELECT * FROM nullTest WHERE name=null; 
Bad Request: Unsupported null value for indexed column name 

再次,这是你不能查询不为空,如果你甚至无法查询列值可能实际上是空的前提下完成的。

所以,我想这是不能做到的。另外,如果主键中有空值,那么您可能需要重新评估数据模型。再次,我知道OP的问题是关于查询哪里的数据是而不是 null。但正如我之前提到的,Cassandra CQL没有NOT或!=操作符,所以这会成为一个问题。

另一种选择是插入空字符串而不是空字符串。然后您将能够查询空字符串。但是,这仍然不能解决您在主键字段中存在空值的基本设计缺陷。也许如果你有一个复合主键,并且只有它的一部分(集群列)有可能被清空(当然不是分区键的一部分)。但是你仍然会遇到无法查询“非空”行(而不是空)的问题。

注意:插入空值仅用于演示目的。这是你应该尽量避免的事情,因为插入一个空列值将会创建一个墓碑。同样,插入大量空值将会创建很多墓碑。

1

1)select * from test;

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)卡桑德拉简化版,支持空值selection.It正显示出我们的理解空。

3),用于处理空值的使用,如“不可用”,“空”另一个字符串,那么我们可以选择数据

相关问题