如何在cassandra中查询!= null列.
Select * from tableA where id != null;
Select * from tableA where name != null;
Run Code Online (Sandbox Code Playgroud)
然后我想存储这些值并将它们插入到不同的表中.
Aar*_*ron 14
我不认为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);
Run Code Online (Sandbox Code Playgroud)
我现在有一个表和两行(一行有空数据):
SELECT * FROM nullTest;
id | name
----+------
2 | null
1 | bob
(2 rows)
Run Code Online (Sandbox Code Playgroud)
然后我尝试在name上创建一个二级索引,我知道它包含空值.
CREATE INDEX nullTestIdx ON nullTest(name);
Run Code Online (Sandbox Code Playgroud)
它让我做到了.现在,我将对该索引运行查询.
SELECT * FROM nullTest WHERE name=null;
Bad Request: Unsupported null value for indexed column name
Run Code Online (Sandbox Code Playgroud)
同样,如果您甚至无法查询实际可能为null的列值,则可以在不能查询非null的前提下完成此操作.
所以,我认为这是不可能完成的.此外,如果主键中存在空值,则可能需要重新评估数据模型.同样,我知道OP的问题是关于查询数据不为空的位置.但正如我之前提到的,Cassandra CQL没有NOT或!=运算符,所以这就是问题所在.
另一种选择是插入一个空字符串而不是null.然后,您就可以查询空字符串.但是,这仍然没有让你超越在主键字段中使用null的基本设计缺陷.也许如果你有一个复合主键,只有一部分(聚类列)有可能是空的(当然不是分区键的一部分).但是你仍然会遇到无法查询"非空"(而非非空)行的问题.
注意:此处仅插入空值以用于演示目的.这是你应该尽力避免的事情,因为插入空列值将创建一个墓碑.同样,插入大量空值会产生大量的墓碑.
| 归档时间: |
|
| 查看次数: |
24999 次 |
| 最近记录: |