MySQl求奇数和函数_MySQL 聚集UDF,计算列表中的奇数总和

本文展示了如何在MySQL中创建一个自定义聚合函数`oddsum`,用于计算列表中的奇数总和。通过编写C代码实现UDF(用户定义函数),并在示例中插入数据并使用新函数进行奇数和的计算。
摘要由CSDN通过智能技术生成

技痒之作 -__-

CREATE AGGREGATE FUNCTION oddsum returns INTEGER SONAME "udf_oddsum.so";

CREATE TABLE `v1` (

`c` int(11) DEFAULT NULL,

`id` int(11) NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into v1 values(1,0), (3,2), (4,4);

select sum(c),oddsum(c) from v1;

+--------+-----------+

| sum(c) | oddsum(c) |

+--------+-----------+

|      8 |         4 |

+--------+-----------+

#ifdef HAVE_STDLIB_H

#include

#endif

#ifdef HAVE_STRING_H

#include

#endif

#ifdef HAVE_STRINGS_H

#include

#endif

#include

#include

#include

#include

my_bool oddsum_init(UDF_INIT *init, UDF_ARGS *args, char *message)

{

if (args->arg_count != 1 || args->arg_type[0] != INT_RESULT) {

return 1;

}

init->ptr = (char *)(malloc(sizeof(longlong)));

bzero((void*)init->ptr, sizeof(longlong));

return 0;

}

void oddsum_add(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error)

{

if (!args->args[0])

return;

longlong new_value= *((longlong*)args->args[0]);

if (new_value % 2)

{

longlong *current_sum= (longlong *)initid->ptr;

*current_sum+= new_value;

}

}

void

oddsum_clear(UDF_INIT* initid, char* is_null __attribute__((unused)),

char* message __attribute__((unused)))

{

bzero((void*)initid->ptr, sizeof(longlong));

}

void oddsum_deinit(UDF_INIT *init)

{

if (init->ptr) {

free(init->ptr);

}

}

longlong oddsum(UDF_INIT* initid, UDF_ARGS* args __attribute__((unused)),

char* is_null, char* error __attribute__((unused)))

{

return *(longlong *)initid->ptr;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值