Null /空のフィールドを持つテーブル内のすべてのレコードを検索するクエリを作成するにはどうすればよいですか?以下のクエリを試してみましたが、何も返されません。
SELECT * FROM book WHERE author = 'null';
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
にはage
とpet
の2つの列があり、coco
にはage
の1つしかないことがわかります。
私の知る限り、NULL
ではこれを行うことはできません。
別の方法として、空の文字列など、別の空の値を使用することもできます:''
その場合、次のように著者が空のすべての本を選択できます(著者の列が適切に索引付けされていると仮定します)。
SELECT * FROM book WHERE author = '';