我有表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
該功能是字符串特定的,我已經嘗試過爲整個列做,但沒有得到一個成功的查詢,根據我的嘗試在頂部提到 –