首页 > 数据库 >postgresql中数据表如何通过一个字段标识数据行多种状态?

postgresql中数据表如何通过一个字段标识数据行多种状态?

时间:2024-10-23 09:31:36浏览次数:4  
标签:状态 arr postgresql 标识 value current 数据表 bit powers

通常我们在业务开发过程中,为了避免多余字段的创建,要尽可能的减少单表字段个数,针对一些数据状态可以采用一个数字融合多种数据状态。

以下是业务开发过程中的枚举类:

@Getter
public enum TicketTagEnum {

    REMINDERS(1, "状态1"),
    REASSIGNMENT(2, "状态2"),
    REWORK(4, "状态3"),
    SUSPEND(8, "状态4"),
    TRANSFER(16, "状态5"),
    INSPECTION(32, "状态6"),
    ALARM(64, "状态7");

    private final Integer code;
    private final String desc;

    TicketTagEnum(Integer code, String desc) {
        this.code = code;
        this.desc = desc;
    }

    // 将标签数字和拆分成2次幂的数字
    public static List<Integer> splitTags(int n) {
        List<Integer> result = new ArrayList<>();
        int bit = 1;
        while (n > 0) {
            if ((n & bit) != 0) {
                result.add(bit);
            }
            n -= (n & bit);
            bit <<= 1;
        }
        return result;
    }

    // 添加标签
    public static int addTag(int oldTag, int newTag) {
        return oldTag | newTag;
    }

    // 移除标签,但是这种计算需要旧的标签中一定包含了新的标签
    public static int removeTag(int oldTag, int newTag) {
        return splitTags(oldTag).contains(newTag) ? oldTag ^ newTag : oldTag;
    }
    
    // 移除标签 更加完善的写法
    public static int removeTagPro(int oldTag, int newTag) {
        return oldTag & ~newTag;
    }
}

添加数据状态时:TicketTagEnum.addTag(oldTag, newTag);

移除数据状态时:TicketTagEnum.removeTag(oldTag, newTag);

SQL查询数据行是否包含某种状态时:select * from table where 4 = any(split_into_powers_of_two_arr(tags))

具体SQL函数的实现如下:

CREATE OR REPLACE FUNCTION "public"."split_into_powers_of_two_arr"("n" int8)
  RETURNS "pg_catalog"."_int8" AS $BODY$
DECLARE
    current_value BIGINT := n;
    current_power BIGINT := 1;
    powers_arr BIGINT[] := '{}';
BEGIN
    WHILE current_value > 0 LOOP
        IF (current_value & 1) = 1 THEN
            powers_arr := array_append(powers_arr, current_power);
        END IF;

        current_value := current_value >> 1;
        current_power := current_power << 1;
    END LOOP;

    RETURN powers_arr;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100

 

标签:状态,arr,postgresql,标识,value,current,数据表,bit,powers
From: https://www.cnblogs.com/xiaowenwen/p/18494474

相关文章

  • .NET云原生应用实践(三):连接到PostgreSQL数据库
    本章目标实现基于PostgreSQL的SDAC(简单数据访问层)将Stickers微服务切换到使用PostgreSQLSDAC为什么选择PostgreSQL数据库?其实并不一定要选择PostgreSQL数据库,这里主要出于几个方面考虑:PostgreSQL免费易用,轻量效率高,能够满足目前的需求PostgreSQL生态成熟,资源丰富,遇到问......
  • 揭秘PostgreSQL的隐藏奥秘:物理、内存与进程模型的深度解析与高效优化策略
    引言PostgreSQL作为一款强大的开源关系型数据库管理系统,以其灵活性、高性能和丰富的功能特性在全球范围内受到广泛欢迎。其底层架构的精心设计,使其在处理复杂查询、支持多种数据类型和高并发用户访问时表现出色。理解PostgreSQL的底层架构不仅有助于提升系统性能,还能帮助开......
  • pbootcms系统 如何修改登陆界面及后台相关版权标识
    1.修改登录界面步骤找到文件:路径: apps/admin/view/default/index.html备份文件:在进行任何修改前,请先备份 index.html 文件,以防止意外情况发生。备份命令示例(Linux):bash cp/path/to/your/project/apps/admin/view/default/index.html/path/to/your/proje......
  • windows下在Postgresql数据库中扩展postgis功能实现存储空间地理数据
    操作分为以下三步:1.下载 Postgresql数据库(在官网直接下载即可)2.下载安装postgis(需要对应pgadmin版本安装时路径要与pgadmin路径一致)3.在pgadmin中新建数据库扩展postgis(执行语句即可)1.下载 Postgresql数据库(在官网直接下载即可)Download(pgadmin.org)2.下载安装postg......
  • PostgreSQL免安装版本
    下载压缩包官网地址:https://www.enterprisedb.com/download-postgresql-binaries解压并新建data文件夹进入pgsql文件夹,新建data文件夹cmd进入pgsql/bin目录,初始化数据库,并设置数据库密码初始化命令:initdb.exe-DF:\pgsql\data-EUTF-8--locale=chs-Uroot-W......
  • 【PostgreSQL】如何安装和配置PgBouncer以提高PostgreSQL的并发处理能力?
    安装和配置PgBouncer以提高PostgreSQL的并发处理能力是一个多步骤的过程。PgBouncer作为连接池器,可以有效地管理到PostgreSQL服务器的连接,从而减少每个新连接所需的开销,并且能够更高效地利用资源。下面是详细的步骤说明,包括如何在Debian/Ubuntu系统上安装PgBouncer以及如何......
  • PostgreSQL中对日期时间进行分组
    PostgreSQL在PostgreSQL中对日期时间进行分组|极客教程(geek-docs.com)#按年月日时分组SELECTextract(yearfromcreated_time)asyear,extract(monthfromcreated_time)asmonth,extract(dayfromcreated_time)asday,extract(hourfromcreated_time)ashour,c......
  • PostgreSQL慢SQL收集和解析
    postgresql通过log_statement参数记录慢SQL语句PostgreSQL可以不借助任何扩展实现对SQL日志的记录,主要依赖于两个参数,也即log_statement和log_min_duration_statement,1,记录的sql类型log_statement='all'可以是none,ddl,mod,all2,记录的sql执行时间阈值log_min_duration_stat......
  • 【PostgreSQL】PostgreSQL支持哪些类型的数据复制方法?
    PostgreSQL提供了多种数据复制方法,以满足不同的业务需求和场景。主要的数据复制方法可以分为两大类:物理复制(PhysicalReplication)和逻辑复制(LogicalReplication)。每种复制方式都有其特定的应用场景、优缺点以及实现机制。物理复制(PhysicalReplication)物理复制是基于......
  • PostgreSQL 17重磅登场——世界上最成功的数据库
    朋友们,万众期待的PostgreSQL大版本发布又来了!这一次,PostgreSQL17带着全新的性能优化和开发者必备的新功能强势登场。与其说这是一场普通的更新,不如说它是一场专为高并发工作负载和海量数据量身打造的技术嘉年华! 在本次的发布说明中,PostgreSQL全球社区也毫不讳言地直接宣布......