2016-09-06 5 views
1

私は最初の文字の単語を取得し、その後ろにピリオドを追加しようとしています。私は私が得ることができる。このようなサンプルクエリが、最初の文字だけを試し行うPosgreSQL:各単語の最初の文字を取得し、ピリオド[。]を追加するには?

D.T. 
D. 
D.L.S 

:私は結果を持っている必要があり

Dela Torre 
Delacruz 
De Los Santos 

:ここ

はmiddlenameの私のサンプルデータであります。

cast(a.first_name ||' ' || 
SUBSTRING (a.middle_name, 1,1) ||'. '|| 
a.last_name as text) as name 

結果:FIRST_NAME D. last_nameの

どのようにそれを行うために、私ができることができますか?

助けてください。^_^

TIA!ここではそれを

SELECT id, first_name || ' ' || string_agg(left(m, 1) || '.', '') || ' ' || last_name AS name 
    FROM (
    SELECT id, first_name, unnest(string_to_array(middle_name, ' ')) m, last_name 
     FROM table1 
) q 
GROUP BY id, first_name, last_name 

を行うには

+0

中間名を配列(ここでは:http://stackoverflow.com/a/8585472/1300049のように)に分割し、各要素の最初の文字を取得する必要があります。 – JleruOHeP

答えて

1

一つの方法は、あなたの文字列がうまくそうでない場合は、大文字と小文字で始まるフォーマットされている場合は、あなたがする正規表現を使用することができますSQLFiddle

+0

これは機能します!どうもありがとう! – fLen

1

ですこの:

SELECT regexp_replace(middle_name, '([a-z ])+', '.', 'g'); 

正規表現は、「言う」:1つの以上の後続小文字やスペースを取り、単一のドットと交換します。 'g'(グローバル)修飾子は、すべての出現に対してこれを繰り返します。 first_namelast_nameとの組み合わせで

SELECT concat_ws(' ', first_name, 
       regexp_replace(middle_name, '([a-z ])+', '.', 'g'), 
       last_name 
       ) AS name 
FROM my_table; 

場合 - ケースのようだとして - 名は大文字と小文字を任意に組み合わせることができ、あなたはに名前を分割する必要があります配列は、最初の文字を取って、それを再組み立て:

SELECT concat_ws(' ', first_name, middle, last_name) AS name 
FROM (
    SELECT first_name, string_agg(left(middle, 1), '.') AS middle, last_name 
    FROM my_table, unnest(string_to_array(middle_name, ' ')) m(middle) 
    GROUP BY first_name, last_name) sub; 

これは重複(first_name, last_name)ペアが存在しないことを前提としています。その場合は、主キーまたはその他の一意の行識別子を含める必要があります。

+0

私はそれを試してみましたが、結果は次のようになりました:first_name DELA.CRUZ last_name、それはfirst_name D.L.です。 last_name – fLen

+0

あなたの質問に投稿したものとは違って、あなたのミドルネームは大文字で表示されているようです。更新された回答をご覧ください。 – Patrick

関連する問題