PostgreSQL 教程: 使用 CAST 转换值的类型

八月 22, 2023

摘要:在本教程中,我们将向您展示如何使用 PostgreSQL 的CAST运算符将一种类型的值转换为另一种类型。

PostgreSQL CAST 运算符简介

在很多情况下,您希望将一种数据类型的值转换为另一种数据类型。PostgreSQL 为您提供了允许您执行此操作的CAST运算符。

下面说明了类型转换CAST的语法:

CAST ( expression AS target_type );

在这个语法中:

  • 首先,指定一个表达式,可以是常量、表列、计算结果的表达式。
  • 然后,指定要将表达式结果值转换为的目标数据类型

PostgreSQL 类型转换 :: 运算符

除了类型转换CAST语法之外,您还可以使用以下语法将一种类型的值转换为另一种类型:

expression::type

请参见以下示例:

SELECT
  '100'::INTEGER,
  '01-OCT-2015'::DATE;

请注意,带有强制转换运算符 (::) 的类型转换语法是 PostgreSQL 特定的,并不符合 SQL 标准。

PostgreSQL CAST 示例

让我们看一些使用CAST运算符将一种类型的值转换为另一种类型的示例。

1) 将字符串转换为整数的示例

以下语句将字符串常量转换为整数:

SELECT
	CAST ('100' AS INTEGER);

PostgreSQL CAST - 将字符串转换为整数

如果表达式无法转换为目标类型,PostgreSQL 将引发错误。请参见以下示例:

SELECT
	CAST ('10C' AS INTEGER);
ERROR:  invalid input syntax for integer: "10C"
LINE 2:  CAST ('10C' AS INTEGER);

2) 将字符串转换为日期的示例

此示例使用CAST将字符串转换为日期

SELECT
   CAST ('2015-01-01' AS DATE),
   CAST ('01-OCT-2015' AS DATE);

PostgreSQL CAST - 将字符串转换为日期

首先,我们将2015-01-01文字字符串转换为January 1st 2015。其次,我们将01-OCT-2015转换为October 1st 2015

3) 将字符串转换为双精度浮点数的示例

在下面的示例中,我们尝试将字符串'10.2'转换为双精度浮点数值:

SELECT
	CAST ('10.2' AS DOUBLE);

哎呀,我们收到以下错误消息:

ERROR:  type "double" does not exist
LINE 2:  CAST ('10.2' AS DOUBLE)

要解决此问题,您需要使用DOUBLE PRECISION而不是DOUBLE,如下所示:

SELECT
   CAST ('10.2' AS DOUBLE PRECISION);

PostgreSQL CAST - 将字符串转换为双精度浮点数

4) 将字符串转换为布尔值的示例

此示例使用CAST()将字符串 ’true’、‘T’ 转换为 true,将 ‘false’、‘F’ 转换为 false:

SELECT 
   CAST('true' AS BOOLEAN),
   CAST('false' as BOOLEAN),
   CAST('T' as BOOLEAN),
   CAST('F' as BOOLEAN);

这是输出:

PostgreSQL CAST - 将字符串转换为布尔值

5) 将字符串转换为时间戳的示例

此示例使用强制转换运算符 (::) 将字符串转换为时间戳

SELECT '2019-06-15 14:30:20'::timestamp;

PostgreSQL CAST - 将字符串转换为时间戳

6) 将字符串转换为时间间隔示例

此示例使用强制转换运算符将字符串转换为时间间隔

SELECT '15 minute'::interval,
 '2 hour'::interval,
 '1 day'::interval,
 '2 week'::interval,
 '3 month'::interval;

这是输出:

PostgreSQL CAST - 将字符串转换为时间间隔

7) 对表数据使用CAST的示例

首先,创建一个由两列组成的ratings表:id 和 rating。rating列的数据类型VARCHAR(1)

CREATE TABLE ratings (
	ID serial PRIMARY KEY,
	rating VARCHAR (1) NOT NULL
);

其次,插入一些示例数据ratings表中。

INSERT INTO ratings (rating)
VALUES
	('A'),
	('B'),
	('C');

由于需求发生变化,我们使用相同的ratings表将评级存储为数字,例如 1、2、3,而不是 A、B 和 C:

INSERT INTO ratings (rating)
VALUES
	(1),
	(2),
	(3);

因此该ratings表存储包括数字和字符串的混合类型值。

SELECT
	*
FROM
	ratings;

PostgreSQL CAST sample table

现在,我们必须将rating列中的所有值转换为整数,所有其他 A、B、C 评级将显示为零。为此,您可以使用带有类型CASTCASE表达式,如下面的查询所示:

SELECT
	id,
	CASE
		WHEN rating~E'^\\d+$' THEN
			CAST (rating AS INTEGER)
		ELSE
			0
		END as rating
FROM
	ratings;

CASE语句检查 rating 的值,如果与整数模式匹配,则将 rating 转换为整数,否则返回 0。

PostgreSQL CAST example

在本教程中,您学习了如何使用 PostgreSQL 的CAST将一种类型的值转换为另一种类型。