PostgreSQL 的内置函数

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

字符串函数:

  • 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 字符,可能需要额外的处理。

数值函数:

  • 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);
    

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

日期和时间函数:

  • 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() 返回的是带时区的时间戳。

聚合函数:

  • 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 也可以用于文本列,在这种情况下它将返回字典顺序最大的值。

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

  • 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() 不考虑分组,它在整个结果集上分配唯一的行号。

条件表达式:

  • 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,
           case
               when age < 18 then 'Minor'
               when age >= 18 and age < 65 then 'Adult'
               else 'Senior'
           end as category
    FROM users;
    

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

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 中的特殊处理。

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

相关推荐
bug菌¹1 分钟前
滚雪球学Oracle[2.5讲]:数据库初始化配置
数据库·oracle·数据库初始化·初始化配置
一休哥助手8 分钟前
Redis 五种数据类型及底层数据结构详解
数据结构·数据库·redis
翔云12345616 分钟前
MVCC(多版本并发控制)
数据库·mysql
代码敲上天.33 分钟前
数据库语句优化
android·数据库·adb
盒马盒马1 小时前
Redis:zset类型
数据库·redis
静听山水1 小时前
mysql语句执行过程
数据库·mysql
虽千万人 吾往矣1 小时前
golang gorm
开发语言·数据库·后端·tcp/ip·golang
mariokkm2 小时前
Django一分钟:在Django中怎么存储树形结构的数据,DRF校验递归嵌套模型的替代方案
数据库·django·sqlite
Wang's Blog3 小时前
Redis: 集群环境搭建,集群状态检查,分析主从日志,查看集群信息
数据库·redis
容器( ु⁎ᴗ_ᴗ⁎)ु.。oO3 小时前
MySQL事务
数据库·mysql