gpt4 book ai didi

sqlite - 使用 SQLite 进行位掩码分组

转载 作者:行者123 更新时间:2023-12-03 16:52:06 25 4
gpt4 key购买 nike

当每个表都有一个用于保存位掩码枚举的字段时,我有一个 sqlite 表。

我想执行一个查询,它将返回所有结果并将所有枚举分组到一个字段中:

服务:TEXT 名称、INTEGER 服务、INTEGER 掩码

SELECT service,XXX FROM Services GROUP BY service

基本上,我希望 XXX 是每个服务的所有掩码的位掩码 OR (|) 的结果。

数据:
'a1',1,1
'a2',1,2,
'a3',1,4,
'a4',1,8,

'b1',2,1,
'b2',2,3,
'b3',2,2

因此,我想获得以下行:
1,15 (1|2|4|8)
2,3 (1|3|2)

谢谢

编辑:
在我最初的问题中,我忘了提到每个掩码不是一个位,而是可以是多个位的掩码(我已经更改了第二个示例以反射(reflect)这一点)。

最佳答案

SQLite 支持自定义聚合函数;根据您的设置,您可以 register a custom function很容易做到这一点。使用 C API:

void bitwise_or_step(sqlite3_context *context, int argc, sqlite3_value** argv)
{
int *buffer = (int *)sqlite3_aggregate_context(context, sizeof(int));
int x = sqlite3_value_int(argv[0]);
*buffer |= x;
}

void bitwise_or_final(sqlite3_context *context)
{
int *buffer = (int *)sqlite3_aggregate_context(context, sizeof(int));
sqlite3_result_int(context, *buffer);
}

sqlite3_create_function_v2(db, "BITWISE_OR", 1, SQLITE_ANY, NULL,
NULL, bitwise_or_step, bitwise_or_final, NULL);

然后在您的 SQL 中,您应该能够执行以下操作:
SELECT service,BITWISE_OR(mask) FROM Services GROUP BY service

如果您使用的是 PHP,您可以 define a custom aggregate function from PHP , 也。

关于sqlite - 使用 SQLite 进行位掩码分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9035649/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com