【发布时间】:2014-01-25 16:38:10
【问题描述】:
如何编写查询来查找表中具有空/空字段的所有记录?我尝试了下面的查询,但它没有返回任何内容。
SELECT * FROM book WHERE author = 'null';
【问题讨论】:
如何编写查询来查找表中具有空/空字段的所有记录?我尝试了下面的查询,但它没有返回任何内容。
SELECT * FROM book WHERE author = 'null';
【问题讨论】:
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 有两列:age 和pet,而coco 只有一列:age。
【讨论】:
据我所知,NULL 无法做到这一点。
作为替代方案,您可以使用不同的空值,例如空字符串:''
在这种情况下,您可以像这样选择所有作者为空的书籍(假设作者列已适当索引):
SELECT * FROM book WHERE author = '';
【讨论】:
如果 your_table 中的 your_column_name 是文本数据类型,那么以下应该可以工作,
SELECT * FROM your_table WHERE your_column_name >= '' ALLOW FILTERING;
【讨论】:
您可以根据您的用例尝试语言技巧;
例如:
如果你有一个列:column_a,它只包含正整数值。
为此用例按此列的 Null 值过滤结果,
您可以将条件应用为:
where column_a <0
【讨论】:
如果您在 Cassandra 上使用 Solr 但不确定直接 Cassandra 查询,这将有效。
SELECT * FROM BOOK WHERE solr_query = ' -author : [* TO *] '
【讨论】: