Xcode,iphone,Sqlite,需要一个签名功能吗?

时间:2011-01-25 17:18:02

标签: iphone xcode sqlite

我需要通过查询对我的组执行sql sign函数以对正数和负数进行分组。

不幸的是,sqlite不包含一个。

有人可以建议一个解决方法吗?或者如何使用xcode中使用的libsqlite3.dylib框架进行广告?

我的查询非常复杂

select fcid, sum(price), (select sum(price) from tmp b where ((b.due < a.due) 
or ((b.due = a.due) and (b.pid <= a.pid)))) as accumulated_price from tmp a 
where due >= '2011-01-25' and due < '2011-02-24' and price <> 0 group by fcid 
order by due, pid;

我正在尝试做的是sign(price)上的一个小组,所以我得到两个结果,负值和正值。这些将代表总支出和总收入。

想添加这些标签(但我不允许创建新的libsqlite3.dylib libsqlite3)

2 个答案:

答案 0 :(得分:0)

不知道这是否是您的最佳选择,但您可以尝试:

select your_val > 0, sum(aggregated_value)
  from your_table
 group by your_val > 0;

这样,您应该{0}为零值或负值,0为正值。

更新:如果1是您需要签名的字段,您可以尝试:

fcid

请注意,您的select fcid > 0, sum(price), ( select sum(price) from tmp b where ((b.due < a.due) or ((b.due = a.due) and (b.pid <= a.pid))) ) as accumulated_price from tmp a where due >= '2011-01-25' and due < '2011-02-24' and price <> 0 group by fcid > 0; 子句无用,因为您无论如何都要对结果进行分组。

答案 1 :(得分:0)

您应该创建自己的签名功能。请参阅Create or Redefine SQL Functions

使用sqlite3_create_function注册一项功能:

sqlite3_create_function( db, "sign", 1, SQLITE_ANY, NULL, signFunc,
                         NULL, NULL);

然后在C中实现signFunc。

static void signFunc(sqlite3_context *c, int argCount, sqlite3_value **args) {
    if ( argCount != 1 ) {
        sqlite3_result_null( c );
        return;
    }

    switch ( sqlite3_value_type( args[0] ) ) {
        case SQLITE_INTEGER: {
            sqlite3_int64 asInt = sqlite3_value_int64( args[0] );
            sqlite3_int64 sign = asInt < 0 ? -1 : (asInt > 0 ? 1 : 0);
            sqlite3_result_int64( c, sign );
            break;
        }
        case SQLITE_FLOAT: {
            double asDouble = sqlite3_value_double( args[0] );
            sqlite3_int64 sign = asDouble < 0 ? -1 : (asDouble > 0 ? 1 : 0);
            sqlite3_result_double( c, sign );
            break;
        }
        case SQLITE_NULL:
        default: {
            sqlite3_result_null( c );
            break;
        }
    }
}