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