【问题标题】:Replace Null function in Cassandra Select Query替换 Cassandra 选择查询中的 Null 函数
【发布时间】:2016-07-18 14:49:54
【问题描述】:

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

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

其中一些 a1(int 类型)为空。

  1. 在 Oracle 中,我们可以使用 nvl(a1,0)
  2. 在 MS SQL Server 中,我们可以使用 isnull(a1,0)

我不知道如何以 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='...';

??

**我的问题是:**

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

【问题讨论】:

  • 嗨 Surajit,不妨考虑阅读 cassandra 的文档。
  • 不,我没有找到任何有用的东西:(

标签: java cassandra


【解决方案1】:

Cassandra 中没有对 nvl 等函数的内置支持。

理论上,从 Cassandra 2.2 开始,您可以定义一个 UDF(用户定义的函数)来满足您的需求;但是,目前无法调用将文字作为参数传递的函数,因此nvl(a1,0) 会抛出错误;这个限制将随着CASSANDRA-10783 而消失。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-08
      • 2015-05-22
      • 1970-01-01
      • 2016-05-18
      • 2016-08-28
      • 1970-01-01
      • 2017-05-01
      • 1970-01-01
      相关资源
      最近更新 更多