【问题标题】:How Can I Search for Records That Have A Null/Empty Field Using CQL?如何使用 CQL 搜索具有 Null/Empty 字段的记录?
【发布时间】:2014-01-25 16:38:10
【问题描述】:

如何编写查询来查找表中具有空/空字段的所有记录?我尝试了下面的查询,但它没有返回任何内容。

SELECT * FROM book WHERE author = 'null';

【问题讨论】:

    标签: cassandra cql


    【解决方案1】:

    null 字段在 Cassandra 中不存在,除非您自己添加。

    您可能会想到 CQL 数据模型,它隐藏了某些实现细节,以便获得更易于理解的数据模型。 Cassandra 是稀疏的,这意味着仅实际存储使用的数据。您可以通过 CQL 将一些测试数据添加到 Cassandra 来将其可视化。

    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
    [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,而coco 只有一列:age

    【讨论】:

      【解决方案2】:

      据我所知,NULL 无法做到这一点。

      作为替代方案,您可以使用不同的空值,例如空字符串:''

      在这种情况下,您可以像这样选择所有作者为空的书籍(假设作者列已适当索引):

      SELECT * FROM book WHERE author = '';
      

      【讨论】:

        【解决方案3】:

        如果 your_table 中的 your_column_name 是文本数据类型,那么以下应该可以工作,

        SELECT * FROM your_table WHERE your_column_name >= '' ALLOW FILTERING;
        

        【讨论】:

          【解决方案4】:

          您可以根据您的用例尝试语言技巧; 例如: 如果你有一个列:column_a,它只包含正整数值。

          为此用例按此列的 Null 值过滤结果, 您可以将条件应用为: where column_a <0

          【讨论】:

            【解决方案5】:

            如果您在 Cassandra 上使用 Solr 但不确定直接 Cassandra 查询,这将有效。

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-07-12
              • 1970-01-01
              • 1970-01-01
              • 2017-09-29
              • 2019-09-20
              相关资源
              最近更新 更多