在 PostgreSQL 中使用 Select 连接列
PostgreSQL 是一个对象关系数据库系统,这意味着它可以支持比它的竞争者 MySQL
更复杂的数据类型。
今天我们将学习使用 SELECT
操作连接表的列。
在 PostgreSQL 中使用||
连接 VARCHAR
类型的列的运算符
现在,假设我们使用以下配置创建了一个表。
createtabletab(idintnotnull,u_namevarchar(50)notnull,PRIMARYKEY(u_name));
然后我们继续往里面插入一些值。
insertintotabvalues(45,'Jonathon'),(56,'Mark'),(68,'Angel');
最后,调用 SELECT
中的连接运算符进行显示。
selectid||u_namefromtab
所以我们会得到如下输出。
输出:
上面的查询是如何工作的?我们使用||
Select
操作中的运算符。
||
运算符在 PostgreSQL 文档中仅定义为连接字符串。
因此,连接其中一列必须是 VARCHAR
数据类型的列并不困难,因为 VARCHAR
对应于 String
。
操纵 SELECT
操作以使用||
当 PostgreSQL 中的列不是字符串时
上面给出的 SELECT
查询的一个非常简单的修改可用于将任何其他数据类型的列连接在一起。
现在让我们假设以下实现。
createtabletab(idintnotnull,ageintnotnull,PRIMARYKEY(id));insertintotabvalues(45,21),(56,22),(68,23)
现在我们知道两列都是 int
;因此,如果你尝试这样做。
selectid||agefromtab
它将返回一个错误。
输出:
ERROR: operator does not exist: integer || integer
HINT: No operator matches the given name and argument types. You might need to add explicit type casts.
因此,这里我们有两个选择:
- 在两列之间连接一个 null
STRING
并使其成为有效操作。 - 将类型转换添加到列值之一。
要提供前一个选项,你所要做的就是将查询更改为类似的内容。
selectid||''||agefromtab
这将返回连接所有相邻列的两个数字。它在两个 int
列之间连接一个空字符串;因此,该操作对该运算符有效,因为至少存在一个 String
。
在 PostgreSQL 中使用 Typecast
(::
表示法) 进行连接
要执行此操作,我们可以使用:
selectid::text||agefromtab
或者
selectid||age::textfromtab
此类型将其中一列转换为 Text
类型,使操作再次有效,因为现在存在一个 String
。
在史前 PostgreSQL 中,这种表示法通常用于将有效类型转换为任何其他类型。
在 PostgreSQL 中使用 CAST(expression as type)
表达式
::
符号以更好的对应物 CAST()
结尾。对于只看代码不知道::
做什么的初学者来说,它是有效且更容易理解的。
selectCAST(idasvarchar(50))||agefromtab
在 PostgreSQL 中使用简单的 CONCAT(col1, col2)
操作
如果你不想进行任何转换,请使你的代码尽可能简单。你可以切换到连接和接受任何给定数据类型的 CONCAT()
函数。
selectconcat(id,age)fromtab
如果 PostgreSQL 中的一列是 NULL
,则使用 COALESCE(variable, to_type)
进行连接
如果变量为 null、0 或其他值,我们使用 COALESCE(variable, to_type)
,以便它保持有效并且不显示 NULL
。
在我们的例子中,将我们的 NULL
列值转换为有效的 String
类型,以便正确连接。
让我们使用以下配置。
createtabletab(idintnotnull,ageint,PRIMARYKEY(id));insertintotabvalues(45,21),(56,NULL),(68,23);
我们为表中的第二组值插入了一个 NULL
。
如果我们现在执行此操作。
selectid::text||agefromtab;
它将返回:
输出:
所以我们可以在这里调用 COALESCE()
。
selectcoalesce(id,0)::text||coalesce(age,0)fromtab;
这往往会返回正确的输出,现在将 NULL
值替换为 0。