sql - 如何使用 Postgres 轻松地从文本字段中获取首字母

标签 sql arrays postgresql aggregate-functions

我使用的是 Postgres 9.4 版,我在表中有一个 full_name 字段。

在某些情况下,我想在我的表中输入首字母而不是人的全名。

类似于:

Name        | Initials
------------------------
Joe Blow    | J. B.  
Phil Smith  | P. S.  

full_name 字段是一个字符串值(很明显),我认为解决这个问题的最佳方法是将字符串拆分为每个空格的数组,即:

select full_name, string_to_array(full_name,' ') initials
from my_table

这会产生以下结果集:

Eric A. Korver;{Eric,A.,Korver}
Ignacio Bueno;{Ignacio,Bueno}
Igmar Mendoza;{Igmar,Mendoza}

现在,我唯一缺少的是如何遍历每个数组元素并从中提取第一个字符。我将最终使用 substring() 来获取每个元素的初始字符 - 但是我只是停留在如何动态循环它们上..

谁有解决这个问题的简单方法?

最佳答案

使用 unneststring_agg:

select full_name, string_agg(substr(initials, 1,1)||'.', ' ') initials
from (
    select full_name, unnest(string_to_array(full_name,' ')) initials
    from my_table
    ) sub
group by 1;

       full_name        |  initials   
------------------------+-------------
 Phil Smith             | P. S.
 Joe Blow               | J. B.
 Jose Maria Allan Pride | J. M. A. P.
 Eric A. Korver         | E. A. K.
(4 rows)

在 Postgres 14+ 中,您可以将 unnest(string_to_array(...)) 替换为 string_to_table(...)

db<>fiddle. 中测试它

关于sql - 如何使用 Postgres 轻松地从文本字段中获取首字母,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33311814/

相关文章:

mysql - 按空格搜索多行

sql - 选择子字符串 SQL

c - 有什么神秘的事情发生吗?

java - int binarySearch 数组列表

PostgreSQL 中的 JSON 模式验证?

ruby-on-rails - 选择 has_many 关联中持有某些条件的所有记录 - Ruby On Rails

node.js - 使用 Sequelize 连接两个表时遇到问题

mysql - 为 MySQL 数据库创建 "data dictionary"的实用程序

sql - 具有基于滞后条件的 Oracle SQL ROW_NUMBER() 窗口

php - 如何在 PHP 中将数组元素转换为字符串?