2015-08-24 76 views
0

我有表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

选择子(CAST( given_names as text),1,1)+子字符串(given_names,charindex('')+('',given_names)+1,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

+0

该功能是字符串特定的,我已经尝试过为整个列做,但没有得到一个成功的查询,根据我的尝试在顶部提到 –

回答

1

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”一样容易,所有这些都在相同的查询中。

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()

只要您对列中名称的数量施加实际限制,上述“作品”即可。我可能会它放入一个观点,所以它可以很容易地在一个地方改变,如果你需要增加名字

0

的最大数目我得到了使用正则表达式

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 

SQL Fiddle example

另一种解决方案

溶液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 

相关问题