PostgreSQL:如何获取每个单词的第一个字母并在之后添加句点[。]?

时间:2016-09-06 02:55:22

标签: postgresql

我试图获得第一个字母单词并在其后添加句点。

以下是我的中间名示例数据:

Dela Torre
Delacruz
De Los Santos

我需要有以下结果:

D.T.
D.
D.L.S

我尝试这样的示例查询,但只是我能得到的第一个字母。

cast(a.first_name  ||' ' ||  
SUBSTRING (a.middle_name, 1,1) ||'. '|| 
a.last_name   as text) as name

结果:first_name D。 last_name

我怎么能这样做?

2 个答案:

答案 0 :(得分:1)

一种方法

SELECT id, first_name || ' ' || string_agg(left(m, 1) || '.', '') || ' ' || last_name AS name
  FROM (
    SELECT id, first_name, unnest(string_to_array(middle_name, ' ')) m, last_name
      FROM table1
  ) q
 GROUP BY id, first_name, last_name

这是SQLFiddle

答案 1 :(得分:1)

如果你的字符串格式很好,首先是大写字母和小写字母,你可以使用正则表达式来执行此操作:

HH:MM

正则表达式“说”:取一个或多个后续小写字母或空格,并将其替换为单个点SELECT regexp_replace(middle_name, '([a-z ])+', '.', 'g'); .(全局)修饰符会针对所有匹配项重复此操作。

'g'first_name结合使用:

last_name

如果 - 似乎是这种情况 - 名称可以是大写和小写字母的任意组合,那么你必须将名称拆分成一个数组,取第一个字母并重新组合它:

SELECT concat_ws(' ', first_name, 
                 regexp_replace(middle_name, '([a-z ])+', '.', 'g'),
                 last_name
                ) AS name
FROM my_table;

这假设没有重复的SELECT concat_ws(' ', first_name, middle, last_name) AS name FROM ( SELECT first_name, string_agg(left(middle, 1), '.') AS middle, last_name FROM my_table, unnest(string_to_array(middle_name, ' ')) m(middle) GROUP BY first_name, last_name) sub; 对。如果是这样,您应该包括主键或其他唯一的行标识符。