Как я могу найти записи, имеющие нулевое/пустое поле с использованием CQL?

Как я могу написать запрос, чтобы найти все записи в таблице с нулевым/пустым полем? Я попытался выполнить запрос ниже, но он ничего не возвращает.

SELECT * FROM book WHERE author = 'null';

Ответ 1

null поля не существуют в Cassandra, если вы не добавите их самостоятельно.

Возможно, вы думаете о модели данных CQL, которая скрывает определенные детали реализации, чтобы иметь более понятную модель данных. Кассандра разрежена, что означает, что фактически хранятся только данные, которые используются. Вы можете визуализировать это, добавив некоторые тестовые данные в 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

Так что даже кажется, что существует нулевое значение, фактическое значение несуществует - CQL показывает вам null, потому что это имеет больше смысла, интуитивно.

Если вы посмотрите на таблицу со стороны Thrift, вы увидите, что таблица не имеет такого значения для возраста coco.

$ bin/cassandra-cli
[[email protected]] use test;
[[email protected]] 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.

Ответ 2

Насколько я знаю, вы не можете сделать это с помощью NULL.

В качестве альтернативы вы можете использовать другое пустое значение, например пустую строку: ''

В этом случае вы можете выбрать все книги с таким пустым автором (при условии, что столбец автора соответствующим образом проиндексирован):

SELECT * FROM book WHERE author = '';

Ответ 3

Это будет работать, если вы используете Solr над Cassandra, но не уверены в непосредственном запросе Cassandra.

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