我有表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
我有表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
,regexp_split_to_table
将在这里帮助很多。
我们的想法是,我们将您的名字分隔成以空格作为分隔符的独立记录。 split_to_table
将为每个遇到的令牌生成一条新记录。
我们也可以捕捉每个firstname
一个row_number()
,所以我们可以拼接的记录重新走到一起使用substring()
获得初使后使用string_agg
。
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
检查工作的例子很酷的事情有关使用此方法是,名字可以是单个单词,或100个字。像“John Jacob Jingleheimer Schmidt”这样的名字将变成“JJJS”,就像名字“Harold”变成“H”一样容易,所有这些都在相同的查询中。
如果你可以在列名的上限生活,这样的事情可能更便宜:
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()
。
只要您对列中名称的数量施加实际限制,上述“作品”即可。我可能会它放入一个观点,所以它可以很容易地在一个地方改变,如果你需要增加名字
的最大数目我得到了使用正则表达式
SELECT string_agg(arr [1], '') AS initials
FROM (
SELECT row_number() OVER() AS rn
,regexp_matches(fname, '\y(?!(the|of)\y)\w', 'gi') arr
FROM tblnames
) t
GROUP BY rn
另一种解决方案
溶液1
SELECT string_agg(col, '') initials
FROM (
SELECT row_number() OVER() AS rn
,left(unnest(string_to_array(fname, ' ')), 1) col
FROM tblnames
) t
GROUP BY rn
解决方案2
用下表为例子
CREATE TABLE tblnames
(
fname varchar(100)
);
INSERT INTO tblnames VALUES
('Stack Overflow'),
('Stack Over Flow'),
('Stackoverflow');
运行此select语句
select string_agg(col,'') from (
SELECT left(unnest(string_to_array('Stack Over Flow', ' ')),1) col
)t
给出了把作为
string_agg
text
---------
SOF
因此,我们可以换上面的select语句到一个函数像下面
create or replace function getInitials(col text) returns text
As
$$
SELECT string_agg(col, '')
FROM (
SELECT left(unnest(string_to_array(col, ' ')), 1) col
) t
$$
language sql
这样我们就可以在表中获取每个FNAME的首字母tblnames像下面选择
select fname,getInitials(fname) initails from tblnames
选择子(CAST( given_names as text),1,1)+子字符串(given_names,charindex('')+('',given_names)+1,1)借用者 –
使用split_to_table或regexp_split_to_table可能会有好处:http:// dba。 stackexch ange.com/questions/74881/postgresql-get-first-letter-of-each-word-except – JNevill
该功能是字符串特定的,我已经尝试过为整个列做,但没有得到一个成功的查询,根据我的尝试在顶部提到 –