web-dev-qa-db-fra.com

Comment puis-je rechercher des enregistrements qui ont un champ nul / vide à l'aide de CQL?

Comment puis-je écrire une requête pour rechercher tous les enregistrements d'une table qui ont un champ nul/vide? J'ai essayé la requête ci-dessous, mais elle ne renvoie rien.

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

null les champs n'existent pas dans Cassandra sauf si vous les ajoutez vous-même.

Vous pensez peut-être au modèle de données CQL, qui cache certains détails d'implémentation afin d'avoir un modèle de données plus compréhensible. Cassandra est rare, ce qui signifie que seules les données utilisées sont réellement stockées. Vous pouvez visualiser cela en ajoutant des données de test à Cassandra via 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

Ainsi, même s'il semble qu'il existe une valeur nulle, la valeur réelle est inexistante - CQL vous montre un null parce que cela a plus de sens, intuitivement.

Si vous jetez un œil à la table du côté Thrift, vous pouvez voir que la table ne contient pas une telle valeur pour l'âge de 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)

Ici, vous pouvez voir clairement que yves a deux colonnes: age et pet, tandis que coco n'en a qu'une: age.

29
Patricia Gorla

Autant que je sache, vous ne pouvez pas le faire avec NULL.

Comme alternative, vous pouvez utiliser une valeur vide différente, par exemple la chaîne vide: ''

Dans ce cas, vous pouvez sélectionner tous les livres avec un auteur vide comme celui-ci (en supposant que la colonne auteur est correctement indexée):

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