PostgreSQL 的内置函数

PostgreSQL 提供了大量的内置函数,这些函数可以在查询中用于处理数据、进行计算和转换。以下是一些常用的 PostgreSQL 函数:

  1. 字符串函数:

    • concat(string1, string2, ...): 连接两个或多个字符串。

      SELECT concat(first_name, ' ', last_name) FROM users;
      

      注意:如果任何参数为 null,结果也将为 null。可以使用 coalesce 函数避免 null 值。

    • length(string): 返回字符串的长度。

      SELECT length(email) FROM users WHERE length(email) > 30;
      

      注意:对于多字节字符集,如 UTF-8,length 可能不会返回实际的字符数,而是字节数。可以使用 char_length 获取字符数。

    • substring(string from start for length): 提取字符串的子串。

      SELECT substring(email from '@' for char_length(email)) FROM users;
      

      注意:PostgreSQL 中的字符串索引从 1 开始。如果 start 是负数,则从字符串末尾开始计数。

    • upper(string): 将字符串转换为大写。

      SELECT upper(first_name) FROM users;
      

      注意:对于非 ASCII 字符,这可能不适用。可以考虑使用 unaccent 函数去除变音符号。

    • lower(string): 将字符串转换为小写。

      SELECT lower(first_name) FROM users;
      

      注意:同 upper,对于非 ASCII 字符,可能需要额外的处理。

  2. 数值函数:

    • round(numeric, decimals): 将数值四舍五入到指定的小数位数。

      SELECT round(price, 2) FROM products;
      

      注意:round 可能会进行银行家舍入(即四舍六入五成双)。

    • ceil(numeric): 返回大于或等于数值的最小整数。

      SELECT ceil(3.14);
      

      注意:ceil 只接受正数参数。

    • floor(numeric): 返回小于或等于数值的最大整数。

      SELECT floor(3.14);
      

      注意:floor 只接受正数参数。

    • sqrt(numeric): 返回数值的平方根。

      SELECT sqrt(16);
      

      注意:如果参数是负数,将返回错误。

  3. 日期和时间函数:

    • current_date: 返回当前的日期。

      SELECT current_date;
      

      注意:这个函数返回的是不带时区的日期。

    • current_time: 返回当前的时间。

      SELECT current_time;
      

      注意:这个函数返回的是不带时区的时间。

    • current_timestamp: 返回当前的日期和时间。

      SELECT current_timestamp;
      

      注意:这个函数返回的是带时区的日期和时间。

    • extract(field from source): 从日期/时间源中提取特定的字段。

      SELECT extract(year from created_at) FROM posts;
      

      注意:field 可以是年、月、日、小时、分钟等。

    • age(date): 返回从一个日期到现在的年龄。

      SELECT age(birthdate) FROM users;
      

      注意:这个函数假设当前日期是今天的日期。

    • now(): 返回当前的日期和时间(带时区)。

      SELECT now();
      

      注意:now() 返回的是带时区的时间戳。

  4. 聚合函数:

    • count(*): 计算记录数。

      SELECT count(*) FROM users;
      

      注意:使用 count(*) 而不是 count(column) 可以避免排除 null 值。

    • sum(expression): 计算数值列的总和。

      SELECT sum(price) FROM orders;
      

      注意:如果列中有 null 值,它们将被忽略。

    • avg(expression): 计算数值列的平均值。

      SELECT avg(score) FROM games;
      

      注意:如果列中有 null 值,它们将被忽略。

    • min(expression): 找出数值列的最小值。

      SELECT min(score) FROM quizzes;
      

      注意:min 可以用于文本列,在这种情况下,它将返回字典顺序最小的值。

    • max(expression): 找出数值列的最大值。

      SELECT max(score) FROM quizzes;
      

      注意:max 也可以用于文本列,在这种情况下它将返回字典顺序最大的值。

  5. 窗口函数(又名分析函数):

    • lag(expression, offset, default): 访问结果集中当前行之前的行的值。

      SELECT score, lag(score, 1) OVER (ORDER BY id) as prev_score
      FROM scores;
      

      注意:lag() 可以用来比较当前行与前行的值。

    • lead(expression, offset, default): 访问结果集中当前行之后的行的值。

      SELECT score, lead(score, 1) OVER (ORDER BY id) as next_score
      FROM scores;
      

      注意:lead() 可以用来比较当前行与后续行的值。

    • dense_rank(): 与 rank() 类似,但排名中没有间隔。

      SELECT dense_rank() OVER (ORDER BY score DESC) as rank, name, score
      FROM players;
      

      注意:dense_rank() 在遇到相同值时不会跳过排名,排名是连续的。

    • rank(): 为结果集中的每一行分配一个唯一的排名。

      SELECT rank() OVER (ORDER BY score DESC) as rank, name, score
      FROM players;
      

      注意:rank() 在遇到相同值时会分配相同的排名,并跳过后面的排名。

    • row_number(): 为结果集中的每一行分配一个唯一的连续整数。

      SELECT row_number() OVER (ORDER BY score DESC) as rank, name, score
      FROM players;
      

      注意:row_number() 不考虑分组,它在整个结果集上分配唯一的行号。

  6. 条件表达式:

    • nullif(expression, value): 如果表达式等于值,则返回 null。

      SELECT nullif(score, 0) as valid_score FROM results;
      

      注意:nullif 用于将特定的值(如 0)转换为 null。

    • coalesce(expression, ...): 返回参数列表中的第一个非空表达式。

      SELECT coalesce(email, phone) as contact FROM users;
      

      注意:coalesce 可以接受多个参数,如果所有参数都是 null,结果将是 null。

    • case when condition then result else alternative end: 根据条件返回不同的结果。

      SELECT name, age,casewhen age < 18 then 'Minor'when age >= 18 and age < 65 then 'Adult'else 'Senior'end as category
      FROM users;
      

      注意:case 表达式可以用于多个条件的复杂逻辑。

  7. JSON和数组函数:

    • array_to_string(array, delimiter): 将数组的所有元素连接成一个字符串。

      SELECT array_to_string(ingredients, ', ') FROM recipes;
      

      注意:这个函数对于将数组转换为可读的字符串非常有用。

    • array_length(array, dimension): 返回数组的长度。

      SELECT array_length(tags, 1) FROM articles;
      

      注意:dimension 参数通常为 1,因为 PostgreSQL 数组只有一个维度。

    • json_array_elements_text(json): 将 JSON 数组扩展为一系列文本元素。

      SELECT json_array_elements_text(likes) FROM posts;
      

      注意:这个函数适用于 JSON 数组,它会为每个数组元素返回一行。

    • json_object_keys(json): 返回 JSON 对象中的所有键。

      SELECT json_object_keys(metadata) FROM datasets;
      

      注意:这个函数只适用于 JSON 对象,不适用于数组。

使用这些函数时,需要注意以下几点:

  • 确保你使用的函数适用于你的数据类型和业务逻辑。
  • 考虑函数的性能影响,尤其是在处理大型数据集时。
  • 对于涉及日期和时间的函数,要注意时区的影响。
  • 在使用聚合函数和窗口函数时,要注意它们的分组和排序规则。
  • 在使用条件表达式时,要确保逻辑覆盖了所有可能的情况。
  • 对于 JSON 和数组函数,要熟悉 JSON 和数组在 PostgreSQL 中的特殊处理。

在实际应用中,你可能需要根据具体的业务需求和数据结构来选择合适的函数,并对其进行适当的调整。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/27412.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入探讨Java中的GraphQL与RESTful API设计

引言 在现代Web应用开发中&#xff0c;API设计是构建可扩展、高性能服务的关键。传统的RESTful API因其简单性和直观性而被广泛采用&#xff0c;但随着应用复杂性的增加&#xff0c;RESTful API在某些场景下可能显得力不从心。GraphQL作为一种新的API技术&#xff0c;提供了一…

如何实现跨域

如何实现跨域 当浏览器执行JS脚本时&#xff0c;会检测脚本要访问的协议&#xff0c;域名&#xff0c;端口号是不是和当前网址一致&#xff0c;不一致就是跨域。 跨域是不允许的&#xff0c;这种限制叫做浏览器的同源策略&#xff0c;简单就是浏览器不允许一个源加载脚本与其…

数据中台:生产制造产业链的“智慧大脑”!

在当今激烈竞争的生产制造领域&#xff0c;数据中台正扮演着至关重要的角色&#xff0c;它就像是产业链的“智慧大脑”&#xff0c;引领着产业的发展方向&#xff01;数据中台在生产制造产业链、生态链中起到以下关键作用&#xff1a; 1. 数据整合与共享&#xff1a;将产业链各…

ozon如何上架产品,ozon平台怎么上架产品

在电子商务领域&#xff0c;产品上架是商家成功运营的关键步骤之一。对于正在或计划进军俄罗斯市场的卖家来说&#xff0c;了解如何在Ozon平台高效上架产品至关重要。接下来讲解下ozon如何上架产品&#xff0c;ozon平台怎么上架产品&#xff01; 产品上架工具&#xff1a;D.DDq…

神经网络学习1—nn.Module

nn.module 为所有神经网络提供了一个模板 import torch.nn as nn import torch.nn.functional as Fclass Model(nn.Module):def __init__(self):super(Model, self).__init__()self.conv1 nn.Conv2d(1, 20, 5)self.conv2 nn.Conv2d(20, 20, 5)def forward(self, x):x F.rel…

Kettle 传参(参数)的使用

Kettle 传参的符号是 ? 。 一、给表改名&#xff0c;并在名称后面加上日期 1、表输入获取名称参数 我这是通过SQL来获取 SELECT concat("score","_",DATE_FORMAT(sysdate(),%Y%m%d%H%i)) aa FROM dual2、执行SQL语句 使用SQL脚本组件 想要获得参数&a…

【MySQL】数据库的增删查改

文章目录 前言1. 新增1.1 全插入1.2 指定某些列名插入1.3 多行插入1.4 边查询边插入 2. 约束2.1 非空约束2.2 唯一性约束2.3 默认值约束2.4 主键约束2.5 外键约束2.6 check 约束2.7 外键的逻辑删除 3. 查询 - 初阶3.1 全列查询3.2 指定列查询3.3 指定表达式查询3.4 别名查询3.5…

HTC-Net

表1 复现结果–Dice&#xff1a;0.8995476149550329&#xff0c;mIOU&#xff1a;0.8395136164423699&#xff0c;Recall&#xff1a;0.8688330349167194&#xff0c;F1-score&#xff1a;0.8573282647143806&#xff0c;PA&#xff1a;0.9356796542306741 与原文结果差不多 表…

python 标识符、变量命名规则

文章目录 一、python 标识符和变量命名规则1、python 标识符2 python 变量和变量命名规则 一、python 标识符和变量命名规则 1、python 标识符 1. 在Python中可以自主命名的内容都属于标识符&#xff0c;比如:变量名,函数名,类名。 2. 标识符必须遵循标识符的规则 注意:如果使用…

小山菌_代码随想录算法训练营第二十三天| 669. 修剪二叉搜索树 、108.将有序数组转换为二叉搜索树 、538.把二叉搜索树转换为累加树

669. 修剪二叉搜索树 文档讲解&#xff1a;代码随想录.修剪二叉搜索树 视频讲解&#xff1a;你修剪的方式不对&#xff0c;我来给你纠正一下&#xff01;| LeetCode&#xff1a;669. 修剪二叉搜索树 状态&#xff1a;已完成 代码实现 /*** Definition for a binary tree node…

springcloud第4季 分布式事务seata作用服务搭建

一 seata作用 1.1 作用 二 seata服务端搭建 2.1 seata搭建 2.2.1 seata 服务端下载安装 下载地址&#xff1a; Seata-Server下载 | Apache Seata 截图如下&#xff1a; 2.2.2 使用mysql初始化seata所需表 1.下载脚本地址&#xff1a;incubator-seata/script/server/db/…

【问题解决】国际化messages_zh_CN.properties中乱码问题

打开 messages_zh_CN.properties 文件 之前用中文写的现在都是各种各样的符号 解决方法&#xff1a; 打开idea 找到File>Settings>Editor>File Encodings 确定这三个地方是否都是utf-8&#xff0c;改好之后点确定&#xff0c;就能正常显示了

使用fvm切换flutter版本

切换flutter版本 下载fvm 1、dart pub global activate fvm dart下载fvm 2、warning中获取下载本地的地址 3、添加用户变量path&#xff1a; 下载地址 终端查看fvm版本 fvm --version 4、指定fvm文件缓存地址 fvm config --cache-path C:\src\fvm&#xff08;自定义地址&…

类android设备reset过程

模式解析流程 frameworks/base/core/java/android/os/PowerManager.javaframeworks/base/services/core/java/com/android/server/power/PowerManagerService.java把reason存储到SystemProperties&#xff0c;最后调用ShutdownThread带着reason传参frameworks/base/services/c…

【代码随想录算法训练营第37期 第三十七天 | LeetCode56. 合并区间、738.单调递增的数字】

代码随想录算法训练营第37期 第三十七天 | LeetCode56. 合并区间、738.单调递增的数字 一、56. 合并区间 解题代码C&#xff1a; class Solution { public:vector<vector<int>> merge(vector<vector<int>>& intervals) {vector<vector<int…

网络超时

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在访问一个网页时&#xff0c;如果该网页长时间未响应&#xff0c;系统就会判断该网页超时&#xff0c;所以无法打开网页。下面通过代码来模拟一个网…

图的遍历介绍

概念 特点 无论是进行哪种遍历&#xff0c;均需要通过设置辅助数组标记顶点是否被访问来避免重复访问&#xff01;&#xff01;&#xff01;&#xff01; 类型 深度优先遍历 可以实现一次遍历访问一个连通图中的所有顶点&#xff0c;只要连通就能继续向下访问。 因此&#x…

day07--454.四数相加II+383. 赎金信+ 15. 三数之和+ 18. 四数之和

一、454.四数相加II 题目链接&#xff1a;https://leetcode.cn/problems/4sum-ii/ 文章讲解&#xff1a;https://programmercarl.com/0454.%E5%9B%9B%E6%95%B0%E7%9B%B8%E5%8A%A0II.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE 视频讲解&#xff1a;https://www.bili…

【论文阅读】-- Omnisketch:高效的多维任意谓词高速流分析

Omnisketch&#xff1a;高效的多维任意谓词高速流分析 摘要1 引言2 预备知识及相关工作3 OMNISKETCH&#xff1a;使用任意谓词估计频率3.1 Sketch S0&#xff1a;Count-Min with rid-sets 用于估计带有谓词的查询3.2 Sketch S1 &#xff08;OmniSketch&#xff09;&#xff1a;…