我试图获得第一个字母单词并在其后添加句点。
以下是我的中间名示例数据:
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
我怎么能这样做?
答案 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
答案 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;
对。如果是这样,您应该包括主键或其他唯一的行标识符。