web-dev-qa-db-ja.com

CQLを使用してNull / Emptyフィールドを持つレコードを検索する方法はありますか

Null /空のフィールドを持つテーブル内のすべてのレコードを検索するクエリを作成するにはどうすればよいですか?以下のクエリを試してみましたが、何も返されません。

SELECT * FROM book WHERE author = 'null';
16
HappyCoder86

nullフィールドは、自分で追加しない限りCassandraには存在しません。

CQLデータモデルを考えているかもしれません。これは、より理解しやすいデータモデルを実現するために、特定の実装の詳細を非表示にします。 Cassandraはスパースであり、実際に使用されるデータのみが保存されることを意味します。テストデータをCassandraを通じてCQLに追加することにより、これを視覚化できます。

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

つまり、null値があるように見えても、実際の値は存在しません。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の2つの列があり、cocoにはageの1つしかないことがわかります。

29
Patricia Gorla

私の知る限り、NULLではこれを行うことはできません。

別の方法として、空の文字列など、別の空の値を使用することもできます:''

その場合、次のように著者が空のすべての本を選択できます(著者の列が適切に索引付けされていると仮定します)。

SELECT * FROM book WHERE author = '';
4
Ike Walker