如何使用CQL搜索具有空/空字段的记录?

时间:2014-01-07 20:20:20

标签: cassandra cql

如何编写查询以查找表中具有空/空字段的所有记录?我尝试过尝试下面的查询,但它没有返回任何内容。

SELECT * FROM book WHERE author = 'null';

5 个答案:

答案 0 :(得分:27)

null字段在Cassandra中不存在,除非您自己添加它们。

您可能正在考虑CQL数据模型,它隐藏了某些实现细节,以便拥有更易理解的数据模型。 Cassandra是稀疏的,这意味着实际上只存储了所使用的数据。您可以通过CQL向Cassandra添加一些测试数据来实现这一点。

cqlsh> CREATE KEYSPACE test WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1 } ;
cqlsh> use test ;
cqlsh:test> CREATE TABLE foo (name text, age int, pet text, primary key (name)) ;
cqlsh:test> insert into foo (name, age, pet) values ('yves', 81, 'german shepherd') ;
cqlsh:test> insert into foo (name, pet) values ('coco', 'ferret') ;

cqlsh:test> SELECT * FROM foo ;

name | age  | pet
-----+-----+------------------
coco | null | ferret
yves |  81  | german shepherd

所以,即使看起来存在空值,实际值也不存在 - CQL向您显示null因为这更直观,更有意义。

如果您查看Thrift方面的表格,您可以看到该表格中没有包含coco年龄的值。

$ bin/cassandra-cli
[default@unknown] use test;
[default@test] list foo;
RowKey: coco
=> (name=, value=, timestamp=1389137986090000)
=> (name=age, value=00000083, timestamp=1389137986090000)
-------------------
RowKey: yves
=> (name=, value=, timestamp=1389137973402000)
=> (name=age, value=00000051, timestamp=1389137973402000)
=> (name=pet, value=6765726d616e207368657068657264, timestamp=1389137973402000)

在这里,您可以清楚地看到yves有两列:agepet,而coco只有一列:age

答案 1 :(得分:3)

据我所知,您无法使用NULL执行此操作。

作为替代方案,您可以使用不同的空值,例如空字符串:''

在这种情况下,您可以选择所有具有空作者的书籍(假设作者列已正确编入索引):

SELECT * FROM book WHERE author = '';

答案 2 :(得分:0)

您可以根据自己的用例尝试使用语言技巧; 例如: 如果您有一列:column_a,仅包含正整数。

对于此用例,可通过此列的 Null 个值来过滤结果, 您可以将条件应用为: where column_a <0

答案 3 :(得分:0)

如果您的表中的您的列名是文本数据类型,则应执行以下操作

SELECT * FROM your_table WHERE your_column_name >= '' ALLOW FILTERING;

答案 4 :(得分:-3)

如果你使用Solr over Cassandra但不确定直接的Cassandra查询,这将有效。

SELECT * FROM BOOK WHERE solr_query = ' -author : [* TO *] '