2015-08-24 78 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 

相關問題