Как я могу написать запрос, чтобы найти все записи в таблице с нулевым/пустым полем? Я попытался выполнить запрос ниже, но он ничего не возвращает.
SELECT * FROM book WHERE author = 'null';
Как я могу написать запрос, чтобы найти все записи в таблице с нулевым/пустым полем? Я попытался выполнить запрос ниже, но он ничего не возвращает.
SELECT * FROM book WHERE author = 'null';
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
.
Насколько я знаю, вы не можете сделать это с помощью NULL
.
В качестве альтернативы вы можете использовать другое пустое значение, например пустую строку: ''
В этом случае вы можете выбрать все книги с таким пустым автором (при условии, что столбец автора соответствующим образом проиндексирован):
SELECT * FROM book WHERE author = '';
Это будет работать, если вы используете Solr над Cassandra, но не уверены в непосредственном запросе Cassandra.
SELECT * FROM BOOK WHERE solr_query = ' -author : [* TO *] '