列中每个单词的第一个字母

时间:2015-08-24 19:17:48

标签: sql postgresql

我的表borrower包含一个名为given_names的列。

我想要一个SQL查询来显示given_names列的所有首字母 表示given_names

中单词的每个首字母

我试过了:

select substring(cast (given_names as text),1,1) + substring(given_names,charindex('')+(' ',given_names)+1,1) 
from borrower

2 个答案:

答案 0 :(得分:1)

正如我在上面的评论中所提到的,regexp_split_to_table会在这里提供很多帮助。

我们的想法是,我们使用空格作为分隔符将您的名称分成单独的记录。 split_to_table将为遇到的每个令牌生成新记录。

我们还可以为每个row_number()捕获firstname,这样我们就可以在使用string_agg获取初始值后使用substring()将记录重新拼接在一起。

SELECT  
  string_agg(initial, '') as initials
FROM
  (
    SELECT 
      row_number() OVER (ORDER BY firstname) as recnum,
      substring(regexp_split_to_table(t.firstname, '\s+') FROM 1 FOR 1) as initial 
    FROM test as t
  ) t_init
GROUP BY recnum

您可以在sqlfiddle

查看一个有效的示例

使用此方法的一个很酷的事情是,firstname可以是单个单词,也可以是100个单词。像“John Jacob Jingleheimer Schmidt”这样的名字将变成“JJJS”,就像“Harold”这个名字会变成“H”一样容易,都在同一个查询中。

答案 1 :(得分:0)

如果您可以使用列中的名称上限,则可能会更便宜:

select given_names, (string_to_array(given_names, ' '))[1],
       concat( 
              left((string_to_array(given_names, ' '))[1], 1),
              left((string_to_array(given_names, ' '))[2], 1),
              left((string_to_array(given_names, ' '))[3], 1),
              left((string_to_array(given_names, ' '))[4], 1),
              left((string_to_array(given_names, ' '))[5], 1),
              left((string_to_array(given_names, ' '))[6], 1)
             )
from borrower;

这将返回前6个名称的首字母(其中“name”是空格之间的任何名称)。如果您还需要考虑其他空格(标签,换行符),则可以使用:regexp_split_to_array(given_names, '\s')代替string_to_array()

只要您可以对列中的名称数量施加实际限制,上述“有效”。我可能会将其放入视图中,因此如果您需要增加最大名称数,可以在一个地方轻松更改