在Cassandra Select Query中替换Null函数

时间:2016-06-08 05:46:06

标签: java cassandra

将从cassandra表中选择一组记录。

select a1,a2,a3 from tableB where solr_query='...';

某些a1(int类型)为空。

  1. 在Oracle中,我们可以使用nvl(a1,0)
  2. 在MS SQL Server中,我们可以使用isnull(a1,0)
  3. 我不知道以cassandra的方式处理

    我如何在Java中处理这个问题:

    创建TableBObject类,其中所有属性都使用tableB(cassandra表)进行映射。

    使用访问器方法

    创建Java访问器接口
    @Accessor
    public interface TableBAccessor
    {
        @Query(select a1,a2,a3 from tableB where solr_query='...';)
        Result<TableBObject> getTableOnSolrQuery (@Param("solrQuery") String solrQuery);
    
    }
    

    在我的调用方法中,我创建了mappingManager并使用了:

    TableBAccessor tableBAccessor = mappingManager.createAccessor();
    
        List<TableBObject> tabBList = tableBAccessor.getTableOnSolrQuery("someSolrQuery").all();
    
        for(TableBObject tabB : tabBList){
    
        int a1 = tabB.getA1(); /*a1 column in cassandra table*/
    
        if(a1!=null){
        // replace a1 by some int value (zero / something else)
    
        }
      }
    

    上面,我在Java中处理相同的问题。

    我正在为此付出额外的努力。

    cassandra中的解决方案除了在Java代码中处理相同内容外,还有什么解决方案?

    **我不能这样写:**

    select isnull(a1,0),a2,a3 from tableB where solr_query='...';

    select nvl(a1,0),a2,a3 from tableB where solr_query='...';

    ...

    **我的问题是:**

    如果,那么 如何 ?如果,那么 为什么

2 个答案:

答案 0 :(得分:2)

Cassandra中没有像nvl这样的函数的内置支持。

理论上,自从Cassandra 2.2你可以定义一个UDF(用户定义的函数)来完成你想要的东西;但是,目前无法调用将文字作为参数传递的函数,因此nvl(a1,0)会抛出错误;此限制将随CASSANDRA-10783而消失。

同时,你应该首先避免存储空值,或者应用客户端函数。

答案 1 :(得分:1)

我发现here Cassandra不支持基于null的查询,即使对于二级索引也是如此。

您可能需要根据您的情况调整给定的解决方案:将另一个名为a1_uninitialized的布尔列默认为true,这将帮助您处理空值。