PostgreSQL模式匹配与日期处理详解
掌握PostgreSQL中的模式匹配与时间处理是优化查询的关键。本文深入解析 LIKE 与 SIMILAR TO 的通配符差异、substring 函数的截取技巧,并系统化梳理日期/时间格式化模板、算术操作符及 EXTRACT 等核心函数,为 SQL 开发提供实用的参考指南。
模式匹配实战
PostgreSQL 提供了三种主要的模式匹配方式:标准的 LKE、更贴近正则的 SIMILAR TO,以及 POSIX 风格正则表达式。理解它们的异同点能显著提升数据筛选的效率。
第一步:掌握 LIKE 操作符及其扩展
目的:使用标准 SQL 方式进行基础字符匹配,支持大小写忽略及自定义转义。
- 基础语法:使用
string LIKE pattern [ESCAPE escape-character]进行匹配。下划线 (_) 匹配单个任意字符,百分号 (%) 匹配零个或多个字符。 - 特殊处理:若需匹配字面量的
_或%,需使用转义字符(默认反斜杠)。可通过ESCAPE ''关闭转义机制,此时通配符功能保留但不可转义。 - 大小写敏感:关键字
ILIKE可实现不区分大小写的匹配(PostgreSQL 特有)。 - 替代符号:~~ 等效于
LKE,~~* 等效于ILIKE。
示例代码:
'abc' LIKE 'a%' -- true
'abc' LIKE '_b_' -- true
'abc' ILIKE 'ABC%' -- true (不区分大小写)
第二步:使用 SIMILAR TO 实现正则逻辑
目的:在不完全使用复杂正则的前提下,利用类似正则的元字符(如 |, *, +)进行灵活的模式构造。
- 兼容通配符:继承
LIKE的_和%含义。 - 扩展元字符:支持
|(选择),*(零次或多次),+(一次或多次),()(分组) 及[](字符表)。 - 提取子串:可使用三参数形式的
substring(string from pattern for escape-char)。此模式下,模式必须匹配整个字符串才能成功,需通过双引号标记期望返回的部分。
示例代码:
-- 包含 b 或 d 的字符串
'abc' SIMILAR TO '%(b|d)%' -- true
-- substring 提取:#为转义符,双引号内为捕获内容
SELECT substring('foobar' from '%#"o_b#"%' FOR '#');
-- 结果: oob
数据类型格式化函数
PostgreSQL 内置了丰富的格式化函数,用于将日期、整数、浮点数等多种类型转换为格式化的字符串,反之亦然。其通用调用习惯为:第一个参数为待格式化值,第二个参数为定义输出模板的文本。
| 函数 | 返回类型 | 描述 | 例子 |
|---|---|---|---|
| to_char(timestamp, text) | text | 把时间戳转换成字串 | to_char(current_timestamp, 'HH12:MI:SS') |
| to_date(text, text) | date | 把字串转换成日期 | to_date('05 Dec 2000', 'DD Mon YYYY') |
| to_number(text, text) | numeric | 把字串转换成numeric | to_number('12,454.8-', '99G999D9S') |
在使用 to_char 时,需要了解以下两种核心模板:
日期/时间格式化模式
| 模式 | 描述 |
|---|---|
| HH / HH12 | 一天的小时数 (01-12) |
| HH24 | 一天的小时数 (00-23) |
| MI | 分钟 (00-59) |
| SS | 秒 (00-59) |
| YYYY | 年 (4位及以上) |
| MM | 月份号 (01-12) |
| Mon / MONTH | 缩写月份名 / 全长大写月份名 |
数值格式化模板模式
| 模式 | 描述 |
|---|---|
| 9 | 带指定位数的值 |
| 0 | 带前导零的值 |
| . | 小数点 |
| , / G | 千位分隔符 |
| D | 小数点占位符 |
| L | 货币符号 |
| PR | 尖括号内显示负值 |
时间与日期函数及操作符
PostgreSQL 提供了强大的时间运算能力,包括标准的四则运算操作符以及提取特定时间片段的系统函数。
时间/日期操作符速查
以下表格展示了日期、时间和间隔 (Interval) 之间的混合运算行为:
| 操作符 | 例子 | 结果类型 |
|---|---|---|
| + | date + interval | timestamp |
| - | date - integer (天数) | date |
| - | date - date | integer (相差的天数) |
| - | time - time | interval |
| * / / | interval * double / interval / double | interval |
核心时间函数
常用的时间获取与处理函数如下:
| 函数 | 返回类型 | 描述 | 例子 | 结果 |
|---|---|---|---|---|
| age(timestamp) | interval | 计算从给定时间到当前的年龄 | age('1957-06-13') | 43 years 8 mons... |
| now() | timestamp | 当前日期和时间 | now() | 2024-05-20 10:00:00 |
| date_trunc(field, timestamp) | timestamp | 截断到指定精度 | date_trunc('hour', ...) | 截去分秒 |
提取时间域:EXTRACT 与 date_part
这两个函数等效,均用于从 timestamp 或 interval 中提取特定的时间域。
| 域名称 | 描述 | 返回值范围 |
|---|---|---|
| CENTURY | 世纪 | N/A |
| YEAR / YEAROF | 年份 | 4位数年份 |
| MONTH | 一年中的第几个月 | 1-12 |
| DAY | 一个月里的第几天 | 1-31 |
| HOUR / MINUTE / SECOND | 时分秒 | 0-23 / 0-59 / 0-59 |
| DOW | 星期几 | 0(周日)-6 |
| DOY | 一年中的第几天 | 1-366 |
| QUARTER | 季度 | 1-4 |
以上就是 PostgreSQL 模式中匹配与日期处理的详细内容,更多关于 PostgreSQL 高级查询技巧的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









