当前位置: 首页 > news >正文

PostgreSQL-常用函数和操作符

PostgreSQL 中文社区

  • PL/pgSQL 是 PostgreSQL 中的一种存储过程语言,它支持许多常用的函数和操作符。下面列举了一些常用的 PL/pgSQL 函数和操作符:

1. 常用函数:

RAISE:用于在存储过程中抛出异常。

RAISE EXCEPTION 'Error occurred: %', error_message;

IF-ELSE:用于条件判断。

IF condition THEN-- do something
ELSE-- do something else
END IF;

FOR LOOP:用于循环操作。

FOR variable_name IN [ REVERSE ] lower_bound..upper_bound LOOP-- loop body
END LOOP;
  • 案例:
CREATE OR REPLACE FUNCTION print_numbers(start_num INT, end_num INT)
RETURNS VOID AS $$
DECLAREi INT;
BEGINFOR i IN start_num..end_num LOOPRAISE NOTICE 'Number: %', i;END LOOP;
END;
$$ LANGUAGE plpgsql;

解析:

  • 这个函数名为 print_numbers,接受两个参数 start_numend_num,然后使用 FOR 循环打印从 start_numend_num 的所有数字。在循环体中,使用 RAISE NOTICE 打印每个数字的值。

WHILE LOOP:用于执行条件循环。

WHILE condition LOOP-- loop body
END LOOP;
  • 案例
CREATE OR REPLACE FUNCTION countdown(start_num INT)
RETURNS VOID AS $$
DECLAREnum INT := start_num;
BEGINWHILE num > 0 LOOPRAISE NOTICE 'Countdown: %', num;num := num - 1;END LOOP;
END;
$$ LANGUAGE plpgsql;

解析:

  • 这个函数名为 countdown,接受一个参数 start_num,然后使用 WHILE 循环实现倒计时功能。在循环体中,首先打印当前数字的值,然后将数字减一。当数字大于零时,循环继续执行,直到数字减至零为止。

RETURN:用于从函数中返回值。

RETURN value;

SELECT INTO:用于将查询结果赋值给变量。

SELECT column_name INTO variable_name FROM table_name WHERE condition;

EXECUTE:用于执行动态 SQL 语句。

EXECUTE 'SELECT * FROM ' || table_name;
  • 案例:

假设有一个存储过程,接收一个表名作为参数,并执行该表的 SELECT 查询,然后返回查询结果。

CREATE OR REPLACE FUNCTION select_from_table(table_name TEXT)
RETURNS TABLE (...) AS $$
DECLAREquery TEXT;
BEGIN-- 构造动态 SQL 查询语句query := 'SELECT * FROM ' || table_name;-- 执行动态 SQL 查询语句RETURN QUERY EXECUTE query;
END;
$$ LANGUAGE plpgsql;

解析:

  • 在这个函数中,首先构造了一个动态 SQL 查询语句,然后使用 EXECUTE 执行该查询语句。最后,使用 RETURN QUERY 返回查询结果。这个函数可以接受任意表名作为参数,并执行相应的查询操作。
  • || 是字符串连接操作符,用于将两个字符串连接起来形成一个新的字符串。
  • RETURNS TABLE (...) 表示函数返回一个表类型的结果集。括号中的内容是结果集的列定义,可以包含列名和数据类型。

GET DIAGNOSTICS:用于获取异常信息。

GET DIAGNOSTICS variable_name = condition;
  • 案例:

假设有一个存储过程,执行一条 SQL 查询,并获取查询结果的行数,并将行数保存到一个变量中。

CREATE OR REPLACE FUNCTION get_row_count()
RETURNS VOID AS $$
DECLARErow_count INT;
BEGIN-- 执行查询语句EXECUTE 'SELECT COUNT(*) FROM your_table' INTO row_count;-- 获取查询结果的行数GET DIAGNOSTICS row_count = ROW_COUNT;-- 打印行数RAISE NOTICE 'Row count: %', row_count;
END;
$$ LANGUAGE plpgsql;

解释:

  • 在这个函数中,首先执行了一条 SQL 查询语句,然后通过 GET DIAGNOSTICS 获取查询结果的行数,并将行数保存到变量 row_count 中。最后,使用 RAISE NOTICE 打印行数。

CURSOR FOR 游标用法(了解)

注意,游标的命名必须唯一,且与其他变量和对象的名称不冲突。

  • 游标声明
DECLAREcursor_name CURSOR FORSELECT column1, column2, ... FROM table_name WHERE condition;

在声明游标时,您指定要使用的查询,并将其分配给一个游标变量。

  • 游标打开
OPEN cursor_name;

打开游标后,它会开始执行与其关联的查询,并准备好从结果集中提取数据。

  • 循环提取数据
LOOPFETCH cursor_name INTO variable1, variable2, ...;-- 在这里对提取出的数据进行处理EXIT WHEN NOT FOUND;
END LOOP;

在循环中,您可以使用FETCH语句从游标中提取数据,并将其存储在指定的变量中。FETCH命令会将游标定位到结果集中的下一行数据。如果没有更多的数据可提取,则FETCH将引发一个NOT FOUND异常。您可以使用EXIT WHEN NOT FOUND语句来退出循环。

  • 关闭游标
CLOSE cursor_name;

在完成对游标的操作后,应该关闭游标以释放资源。

  • 案例1:

    • 打印当前月数据
CREATE OR REPLACE FUNCTION "myschema"."pr_date"()RETURNS "pg_catalog"."void" AS $BODY$
DECLAREv_current_month DATE := DATE_TRUNC('month', CURRENT_DATE);v_record users%ROWTYPE;
BEGINFOR v_record INSELECT * FROM users WHERE DATE_TRUNC('month', created_at) = v_current_monthLOOPRAISE NOTICE 'Data: %', v_record;END LOOP;RETURN;
EXCEPTIONWHEN others THENRAISE EXCEPTION 'Error occurred: %', SQLERRM;
END;
$BODY$ LANGUAGE plpgsql;

可以优化为for查询:(结构更加清晰…)

CREATE OR REPLACE FUNCTION "myschema"."pr_dat"()RETURNS "pg_catalog"."void" AS $BODY$
DECLAREv_current_month DATE := DATE_TRUNC('month', CURRENT_DATE);v_record users%ROWTYPE;
BEGINFOR v_record INSELECT * FROM users WHERE DATE_TRUNC('month', created_at) = v_current_monthLOOPRAISE NOTICE 'Data: %', v_record;END LOOP;RETURN;
EXCEPTIONWHEN others THENRAISE EXCEPTION 'Error occurred: %', SQLERRM;
END;
$BODY$ LANGUAGE plpgsql;

如果需要只需要打印某个字段,如下:

CREATE OR REPLACE FUNCTION "myschema"."pr_dat"()RETURNS "pg_catalog"."void" AS $BODY$
DECLAREv_current_month DATE := DATE_TRUNC('month', CURRENT_DATE);v_record TEXT; -- 设定为与 name 字段相匹配的数据类型
BEGINFOR v_record INSELECT name FROM users WHERE DATE_TRUNC('month', created_at) = v_current_monthLOOPRAISE NOTICE 'Data: %', v_record;END LOOP;RETURN;
EXCEPTIONWHEN others THENRAISE EXCEPTION 'Error occurred: %', SQLERRM;
END;
$BODY$ LANGUAGE plpgsql;

2. 常用操作符:

:=:赋值操作符,用于将值赋给变量。

variable_name := value;

IF-THEN-ELSE:条件判断操作符。

IF condition THEN-- do something
ELSE-- do something else
END IF;

=:相等比较操作符。

IF variable_name = value THEN-- do something
END IF;

!=<>:不等于比较操作符。

IF variable_name != value THEN-- do something
END IF;

<, >, <=, >=:大小比较操作符,用于进行大小比较。

IF variable_name < value THEN-- do something
END IF;

AND, OR, NOT:逻辑操作符,用于组合条件。

IF condition1 AND condition2 THEN-- do something
END IF;

IS NULL, IS NOT NULL:判断是否为空值。

IF variable_name IS NULL THEN-- do something
END IF;

LIKE, ILIKE:模糊匹配操作符,用于模式匹配。

IF variable_name LIKE 'pattern' THEN-- do something
END IF;
  • 案例:

假设有一个存储过程,接收一个参数,并根据参数值判断执行不同的逻辑操作。

CREATE OR REPLACE FUNCTION check_pattern(input_value TEXT)
RETURNS VOID AS $$
BEGINIF input_value LIKE 'abc%' THENRAISE NOTICE 'Input value starts with "abc"';ELSERAISE NOTICE 'Input value does not start with "abc"';END IF;
END;
$$ LANGUAGE plpgsql;

解析:

  • 在这个函数中,使用了 LIKE 操作符来判断输入参数 input_value 是否以 “abc” 开头。如果是,则打印消息 “Input value starts with “abc””;如果不是,则打印消息 “Input value does not start with “abc””。

相关文章:

PostgreSQL-常用函数和操作符

PostgreSQL 中文社区 PL/pgSQL 是 PostgreSQL 中的一种存储过程语言&#xff0c;它支持许多常用的函数和操作符。下面列举了一些常用的 PL/pgSQL 函数和操作符&#xff1a; 1. 常用函数&#xff1a; RAISE&#xff1a;用于在存储过程中抛出异常。 RAISE EXCEPTION Error oc…...

河南大学大礼堂火灾事故引发安防监控对智能分析技术应用的思考

一、方案背景 2024年5月2日&#xff0c;在修缮施工期间的河南大学河南留学欧美预备学校旧址大礼堂发生火情。现场航拍画面显示&#xff0c;大礼堂经过火灾&#xff0c;房顶已经基本坍塌&#xff0c;被火烧过的建筑呈焦黑状。 公开资料显示&#xff0c;大礼堂属河南留学欧美预…...

自动化中遇到的问题归纳总结

1、动态元素定位不到 解决方法&#xff1a;尽量使用固定元素定位&#xff0c;如没有固定元素&#xff0c;则采用绝对路径进行定位&#xff0c;因为元素路径是唯一且不变的 2、自动化脚本执行速度较慢 尽量使用css方法定位元素&#xff0c;使用等待时&#xff0c;少用sleep方…...

UE4_照亮环境_不同雾效的动态切换

一、问题及思路&#xff1a; 我们在一个地图上&#xff0c;经常切换不同的区域&#xff0c;不同的区域可能需要不同的色调&#xff0c;例如暖色调的野外或者幽暗的山洞&#xff0c;这两种环境上&#xff0c;雾效的选用肯定不一样&#xff0c;夕阳西下的户外用的就是偏暖的色调&…...

【解决】Android APK文件安装时 已包含数字签名相同APP问题

引言 在开发Android程序过程中&#xff0c;编译好的APK文件&#xff0c;安装至Android手机时&#xff0c;有时会报 包含数字签名相同的APP 然后无法安装的问题&#xff0c;这可能是之前安装过同签名的APP&#xff0c;但是如果不知道哪个是&#xff0c;无法有效卸载&#xff0c;…...

layui的treeTable组件,多层级上传按钮失效的问题解决

现象描述: layui的treeTable 的上传按钮在一层能用&#xff0c;展开后其他按钮正常点击&#xff0c;上传按钮无效。 具体原因没有深究&#xff0c;大概率是展开的子菜单没有被渲染treeTable的done管理到&#xff0c;导致没有重绘上传按钮。 解决方案: 不使用layu的上传组件方法…...

HashMap在JDK1.8的优化

目录 数据结构上的优化 Hash碰撞问题解决方案的优化 Hash值算法的优化...

Kotlin标准函数和静态方法

标准函数 with 第一个参数是一个类型或者对象&#xff0c;第二个参数是lambda表达式。其中第一个参数为第二个参数提供上下文&#xff0c;返回值是最后一行。案例代码&#xff1a; fun main() {val list mutableListOf<String>()var ret with(list) {add("1&q…...

RabbitMQ(四种使用模式)

文章目录 1.Fanout&#xff08;广播模式&#xff09;1.基本介绍2.需求分析3.具体实现1.编写配置类 RabbitMQConfig.java2.编写生产者&#xff0c;发送消息到交换机 MQSender.java3.编写消费者&#xff0c;接受消息 MQReceiver.java4.控制层调用方法&#xff0c;发送信息到交换机…...

【UE5 C++】基础学习笔记——01 UObject的创建与使用

目录 步骤 一、创建UObject 二、创建基于UObject的蓝图类 三、在UObject中使用变量和函数 步骤 一、创建UObject 在内容浏览器中新建一个C类 父类选择“Object” 类的类型设置为公有&#xff0c;这里就命名为“MyObject”&#xff0c;点击“创建类”来创建头文件和源文…...

TCP及IP协议

TCP协议的传输是可靠的&#xff0c;而UDP协议的传输“尽力而为” TCP传输可靠性———确认&#xff0c;重传&#xff0c;排序&#xff0c;流控。 流控&#xff1a;滑动窗口机制 TTL--- 数据包每经过一个路由器的转发&#xff0c;他的TTL值将减1&#xff0c;当一个数据包中的T…...

运筹系列92:vrp算法包VROOM

1. 介绍 VROOM is an open-source optimization engine written in C20 that aim at providing good solutions to various real-life vehicle routing problems (VRP) within a small computing time. 可以解决如下问题&#xff1a; TSP (travelling salesman problem) CVRP …...

【Spring Security注解详解】

Spring Security 是一个强大的、高度可定制的身份验证和访问控制框架&#xff0c;广泛用于Java应用程序中以确保安全。它提供了多种注解来简化安全控制的实现&#xff0c;特别是在方法级别的权限控制上。以下是几个核心的Spring Security注解及其用途的详细介绍&#xff1a; 1…...

C++学习笔记3

A. 求出那个数 题目描述 喵喵是一个爱睡懒觉的姑娘&#xff0c;所以每天早上喵喵的妈妈都花费很大的力气才能把喵喵叫起来去上学。 在放学的路上&#xff0c;喵喵看到有一家店在打折卖闹钟&#xff0c;她就准备买个闹钟回家叫自己早晨起床&#xff0c;以便不让妈妈这么的辛苦…...

基于SpringBoot的酒店(预约)客房管理系统的设计与实现+毕业论文

系统介绍 酒店客房管理系统为酒店管理者和用户、清洁人员提供一个在线管理酒店客房的系统。在网站的设计中&#xff0c;一共分为了两个模块设计&#xff0c;一个是前台模块&#xff0c;一个是后台模块&#xff0c;前台主要用于提供查看客房信息&#xff0c;酒店资讯&#xff0…...

Rust 中的声明可见性

Rust 中的声明可见性 在 Rust 编程语言中&#xff0c;声明可见性是一个核心概念&#xff0c;它决定了代码中的项&#xff08;如函数、结构体、枚举等&#xff09;在哪些范围内可以被访问。Rust 通过一套严谨的规则来控制这些可见性&#xff0c;以确保代码的安全性和封装性。下…...

让 计算机 将 数学 公式 表达式 的计算过程绘制出来 【mathematical-expression(MAE)】

目录 文章目录 目录介绍开始实战引入数学表达式计算库引入流程图代码生成库开始进行生成 介绍 大家好 今天我们来分享一个新知识&#xff0c;将数学表达式的整个计算过程&#xff0c;以及计算繁多结果在 Java 中绘制出来&#xff0c;计算机中的数学表达式计算的功能很常见了&a…...

Django——中间件

Django——中间件 中间件可以介入 Django 的请求和响应的处理过程&#xff0c;修改 Django 的响应数据。中间件的设计为程序开发者提供了一种无侵入式的开发方式&#xff0c;增强 Django 框架的健壮性。 中间件可以在 Django 处理视图的不同阶段的干预。 Django 框架中原先内…...

景联文科技:用高质量数据采集标注赋能无人机技术,引领无人机迈入新纪元!

随着无人机技术的不断发展与革新&#xff0c;它已成为现代社会中一个前景无限的科技领域。 无人机应用领域 边境巡逻与安防&#xff1a;边境管理部门利用无人机监控边境线&#xff0c;防止非法越境和其他安全威胁&#xff0c;同时也能监控地面安保人员的工作状态和行动路线。 …...

SpringBoot集成Redis,使用RedisTemple存储对象使用纯JSON格式

SpringBoot集成Redis,使用RedisTemple存储对象使用纯JSON格式 1、对象使用Json序列化 import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.parser.ParserConfig; import com.alibaba.fastjson.serializer.SerializerFeature; import org.springframework.data.r…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...