我使用的是 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()
来获取每个元素的初始字符 - 但是我只是停留在如何动态循环它们上..
谁有解决这个问题的简单方法?
最佳答案
使用 unnest
和 string_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/