PostgreSQL字段类型说明

本文详细介绍了 PostgreSQL 中的各种数据类型,包括整数、浮点数、字符串、日期时间等,并给出了具体的示例说明如何进行类型转换。

 

BIGSERIAL
SERIAL8 
存储自动递增的惟一整数,最多 8 字节。

BIT 
固定长度的位串。

BIT VARYING(n)
VARBIT(n) 
可变长度的位串,长度为 n 位。

BOOLEAN 
存储逻辑布尔值(true/false/unknown),可以是 TRUE、t、true、y、yes 和 1,或者 FALSE、f、false、n、no 和 0。

BYTEA 
用于存储大型二进制对象(比如图形)的原始二进制数据。使用的存储空间是 4 字节加上二进制串的长度。

CHAR(n)
CHARACTER(n) 
包含固定长度的字符串,用空格填充到长度 n。

DATE 
用 4 字节的存储空间存储日历日期(年、月、日)。

DATETIME 
存储日历日期和天内的时间。

DECIMAL(p,s)
NUMERIC(p,s) 
存储精确的数值,精度(p)和刻度(s)为 0 或更高。

FLOAT4
REAL 
存储浮点数,精度为 8 或更低和 6 个小数位。

FLOAT8
DOUBLE PRECISION 
存储浮点数,精度为 16 或更低和 15 个小数位。

SMALLINT 
存储有符号或无符号 2 字节整数。

INTEGER 
存储有符号或无符号 4 字节整数。

INT8
BIGINT 
存储有符号或无符号 8 字节整数。

SERIAL
SERIAL4 
存储自动递增的惟一整数值,最多 4 字节存储空间。

TEXT 
存储长度可变的大型字符串数据,最多 1 GB。PostgreSQL 自动压缩 TEXT 字符串。

TIME (WITHOUT TIME ZONE |
WITH TIME ZONE) 
存储天内的时间。如果不存储数据库服务器的时区,就使用 8 字节的存储空间;如果存储时区,就使用 12 字节。

TIMESTAMP (WITHOUT TIME ZONE |
WITH TIME ZONE) 
存储日期和时间。可以存储或不存储数据库服务器的时区,使用 8 字节存储空间。

VARCHAR(n)
CHARACTER VARYING(n)
CHARACTER VARYING 
存储可变长度的字符串,最大长度为 n。不存储末尾的空格。
 

 

  类似Oracle ,PostgreSQL也有强大的类型转换函数, 下面仅举两个类型转换例子。

 
 
 

      
--1 例子
postgres=# select 1/4;
 ?column? 
----------
        0
(1 row)

        在PG里如果想做除法并想保留小数,用上面的方法却行不通,因为"/" 运算结果为取整,并
且会截掉小数部分。
 

--2 类型转换
postgres=# select round(1::numeric/4::numeric,2);
 round 
-------
  0.25
(1 row)

  备注:类型转换后,就能保留小数部分了。


--3 也可以通过 cast 函数进行转换
postgres=# select round( cast ( 1 as numeric )/ cast( 4 as numeric),2);
 round 
-------
  0.25
(1 row)


--4 关于 cast 函数的用法
postgres=# SELECT substr(CAST (1234 AS text), 3,1);
 substr 
--------
 3
(1 row)


--5 附: PostgreSQL 类型转换函数

 

FunctionReturn TypeDescriptionExample


to_char
(timestamp, text

)


text
convert time stamp to string
to_char(current_timestamp, 'HH12:MI:SS')

to_char
(
interval, text
)

text
convert interval to string
to_char(interval '15h 2m 12s', 'HH24:MI:SS')

to_char
(
int, text
)

text
convert integer to string
to_char(125, '999')


to_char
(
double

precision
, text
)


text
convert real/double precision to string
to_char(125.8::real, '999D9')

to_char
(
numeric, text
)

text
convert numeric to string
to_char(-125.8, '999D99S')

to_date
(text, text
)

date
convert string to date
to_date('05 Dec 2000', 'DD Mon YYYY')

to_number
(
text, text
)

numeric
convert string to numeric
to_number('12,454.8-', '99G999D9S')

to_timestamp
(
text, text
)

timestamp with time zone
convert string to time stamp
to_timestamp('05 Dec 2000', 'DD Mon YYYY')

to_timestamp
(
double precision
)

timestamp with time zone
convert Unix epoch to time stamp
to_timestamp(1284352323)
 
 
1varcharjava.lang.String12 
2bpcharjava.lang.String1 
3cidrjava.lang.Object1,111 
4inetjava.lang.Object1,111 
5macaddrjava.lang.Object1,111 
6textjava.lang.String12 
7int8java.lang.Long-5 
8int8java.lang.Long-5 
9boxjava.lang.Object1,111 
10circlejava.lang.Object1,111 
11float8java.lang.Double8 
12int4java.lang.Integer4 
13intervaljava.lang.Object1,111 
14linejava.lang.Object1,111 
15lsegjava.lang.Object1,111 
16moneyjava.lang.Double8 
17numericjava.math.BigDecimal2 
18pathjava.lang.Object1,111 
19pointjava.lang.Object1,111 
20polygonjava.lang.Object1,111 
21float4java.lang.Float7 
22int2java.lang.Integer5 
23int4java.lang.Integer4 
24timejava.sql.Time92 
25timestampjava.sql.Timestamp93 
26bitjava.lang.Boolean-7 
27varbitjava.lang.Object1,111 
28booljava.lang.Boolean-7 
29bytea[B-2

转载于:https://www.cnblogs.com/logsharing/p/8260129.html

<think>好的,我现在需要帮助用户解决在PostgreSQL中将字段按逗号分隔的问题。用户提到了split_part和string_to_array函数,还引用了两个参考资料。首先,我应该回顾用户之前的对话,看看他之前的问题是什么。 用户之前询问的是在存储过程中定义临时变量,现在向了字段分隔。这可能是在处理数据时遇到了需要拆分逗号分隔字符串的情况。用户引用了split_part和string_to_array,说明他可能已经查阅过相关资料,但需要更具体的指导。 我需要先确定用户的需求是什么。他想将一个包含逗号分隔的字符串字段拆分成多行,还是拆分出特定部分?根据用户提供的引用,split_part用于提取特定位置的子串,而string_to_array将字符串换为数组。用户可能想了解这两个函数的区别以及如何应用。 接下来,我需要考虑PostgreSQL中处理逗号分隔字符串的常见方法。例如,使用string_to_array将字符串为数组,然后结合unnest函数展开成多行。或者用split_part直接获取特定位置的元素。用户提供的示例中,引用了regexp_split_to_table,这也是一个可行的函数,可以将字符串拆分成表的形式。 需要比较这些方法的优缺点。例如,string_to_array更灵活,可以生成数组,方便后续处理;而split_part适合提取特定位置的元素。用户可能想知道在不同场景下应该选择哪个函数。 此外,用户可能遇到性能问题,比如处理大量数据时的效率,或者如何处理空值或非标准分隔符的情况。需要提醒用户注意数据中的异常情况,比如多余的空格或不一致的分隔符,建议使用trim函数清理数据。 还需要考虑版本兼容性,确保提到的函数在用户使用的PostgreSQL版本中可用。例如,regexp_split_to_table在较新的版本中支持,而split_part和string_to_array可能在旧版本中也有。 最后,用户可能需要实际的示例来理解如何应用这些函数。例如,如何将一列逗号分隔的值拆分成多行,或者如何提取第三个元素。需要提供清晰的代码示例,并解释每个步骤的作用,确保用户能够复制并应用到自己的数据库中。 总结用户的需求,他需要了解在PostgreSQL中如何有效地拆分逗号分隔的字段,选择合适的函数,并处理可能遇到的问题。因此,我的回答应该涵盖常用函数、使用场景、示例代码以及注意事项,帮助用户全面理解和应用这些方法。</think>--- ### 一、PostgreSQL 逗号分隔字段处理核心函数 根据你的需求,PostgreSQL 提供以下三种主要方法实现字段拆分: #### 1. **`string_to_array` + `unnest`** **功能**:将字符串换为数组类型,再展开为多行记录 **场景**:需要将逗号分隔字段拆分成独立行数据 **示例**: ```sql SELECT id, unnest(string_to_array(tags, ',')) AS tag -- 拆分tags字段 FROM products; ``` **输出**: ``` id | tag ----+--------- 1 | 电子 1 | 数码 2 | 家居 ``` #### 2. **`split_part`** **功能**:按位置提取特定子串 **场景**:需要获取分隔字符串中的第N个元素 **语法**:`split_part(string, delimiter, position)` **示例**: ```sql SELECT split_part('A,B,C,D', ',', 3) AS third_element; -- 提取第三个元素 ``` **输出**: ``` third_element --------------- C ``` #### 3. **`regexp_split_to_table`** **功能**:通过正则表达式拆分字符串为多行 **场景**:处理复杂分隔符(如多个逗号或空格) **示例**: ```sql SELECT regexp_split_to_table('电子, 数码; 家居', '[,;]+\s*') AS clean_tag; -- 处理混合分隔符 ``` **输出**: ``` clean_tag ----------- 电子 数码 家居 ``` --- ### 二、方法对比与选型指南 | 方法 | 优势 | 局限性 | 性能 | |-----------------------|-----------------------------|--------------------------|----------| | `string_to_array` | 支持数组操作,可配合`unnest`扩展 | 需要两次函数调用 | 较高 ★★★☆ | | `split_part` | 直接定位元素,无需展开所有结果 | 只能获取单个位置元素 | 最高 ★★★★ | | `regexp_split_to_table`| 处理复杂分隔符(正则表达式) | 正则表达式可能影响性能 | 中等 ★★☆☆ | --- ### 三、实际应用场景示例 #### 场景1:统计每个标签的出现频率 ```sql SELECT tag, COUNT(*) AS frequency FROM ( SELECT unnest(string_to_array(tags, ',')) AS tag FROM products ) sub GROUP BY tag ORDER BY frequency DESC; ``` #### 场景2:提取订单中的第三个商品ID ```sql SELECT order_id, split_part(product_ids, ',', 3) AS third_product -- 获取第三个商品 FROM orders WHERE split_part(product_ids, ',', 3) <> ''; ``` --- ### 四、注意事项 1. **空值处理**: ```sql -- 使用COALESCE处理空字段 unnest(string_to_array(COALESCE(tags, ''), ',')) ``` 2. **去除空格**: ```sql -- 先清理数据再拆分 split_part(TRIM(BOTH ' ' FROM tags), ',', 2) ``` 3. **性能优化**: - 对大表操作时优先使用`split_part`[^2] - 避免在WHERE条件中使用拆分函数 --- ### 五、扩展应用(JSON处理) 若字段存储格式为JSON数组,可直接使用JSON解析: ```sql SELECT id, jsonb_array_elements_text(tags::jsonb) AS tag -- 解析JSON数组 FROM products_with_json; ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值