2017-10-13 7 views
1

私のテーブルの名前と姓の最初の文字を連結したいのですが、テーブルのフィールド名はcname size varchar2(20)です。 私の表は、この私のテーブルからfirstnameとlastnameの1文字の文字を連結したいですか?

CNAME 
------------- 
JOHN XAVIER 
ANU SAM 
ANU SAM 
Phil ober 
vivek sundar 
Xylona Preis 
Xylona Preis 
Darren WHITE 
FRANCIS GEORGE 

である私は、この出力を取得するには、クエリの下にこれを試してみました。

`select SUBSTR(CNAME,1,1)||SUBSTR(CNAME,(INSTR(CNAME,'')+1),1`) FROM SALES; 

しかし、私はこのような出力ました:ここ は、クエリで、私はそれが理由space.My予想される出力であるかわからない

CNAME 
------ 
J 
A 
A 
P 
V 
X 
X 
D 
F 

をこのです:

cname 
----- 
JX 
AS 
AS 
Po 
vs 
XP 
XP 
DW 
FG 

助けてください。

+2

名前に2つ以上の部分がある場合はどうなりますか?例:Dave Benson-PhilipsまたはJesus H Christ? – JohnHC

答えて

0

マイクエリ

select substr(cname,1,1) || substr(cname,instr(cname,' ')+1,1) 
from hkc_test; 

作品。

注「と」の間にスペース

クエリでバッククォートは何ですか?

+0

これは、ミドルネームでは失敗します。ジョンパーカースティーブンス。 –

+0

ありがとうございました.Gotエラー、私は正しい回答のinstr.thankのためのブラケットを入れていませんでした。 – sri

1

名前に任意の数のミドルネームまたはミドルネームのイニシャルがあっても機能するソリューションがあります。 REGEXP_SUBSTRを使って名前の最初の文字を見つけることができます。名前の中の孤立した最後の単語、おそらく姓を見つけるためにも使うことができます。次に、その姓の最初の文字を取って最初の文字を取得します。ここ

SELECT 
    REGEXP_SUBSTR ('John Mark Xavier', '(\S)') || 
    SUBSTR(REGEXP_SUBSTR ('John Mark Xavier', '(\S*)$'), 1, 1) AS cname 
FROM dual; 

デモ:

Rextester

1

あなたは使用することができます。

UPPER(
    SUBSTR(CNAME, 1, 1) 
    || SUBSTR(CNAME, INSTR(CNAME, ' ', -1) + 1, 1) 
) 

は、姓と名の最初の文字を取得するにはか:

REGEXP_REPLACE(CNAME, '(\w)\w*\W*', '\1') 

または

REGEXP_REPLACE(CNAME, '([A-Z])[A-Z'']*[^A-Z'']*', '\1', 1, 0, 'i') 

がそれぞれの最初の文字を取得するには名。

SQL Fiddle

Oracleの11グラムR2スキーマのセットアップ:1

CREATE TABLE sales (CNAME) AS 
SELECT 'JOHN XAVIER' FROM DUAL UNION ALL 
SELECT 'ANU SAM' FROM DUAL UNION ALL 
SELECT 'ANU SAM' FROM DUAL UNION ALL 
SELECT 'Phil ober' FROM DUAL UNION ALL 
SELECT 'vivek sundar' FROM DUAL UNION ALL 
SELECT 'Xylona Preis' FROM DUAL UNION ALL 
SELECT 'Xylona Preis' FROM DUAL UNION ALL 
SELECT 'Darren WHITE' FROM DUAL UNION ALL 
SELECT 'FRANCIS GEORGE' FROM DUAL UNION ALL 
SELECT 'JOHN Smith-Smythe' FROM DUAL UNION ALL 
SELECT 'RICHARD O''BRIEN' FROM DUAL UNION ALL 
SELECT 'GEORGE W BUSH' FROM DUAL 

問合せ:

SELECT UPPER(
     SUBSTR(CNAME, 1, 1) 
     || SUBSTR(CNAME, INSTR(CNAME, ' ', -1) + 1, 1) 
     ) AS cname, 
     REGEXP_REPLACE(CNAME, '([A-Z])[A-Z'']*[^A-Z'']*', '\1', 1, 0, 'i') AS cname2 
FROM Sales 

Results

| CNAME | CNAME2 | 
|-------|--------| 
| JX |  JX | 
| AS |  AS | 
| AS |  AS | 
| PO |  Po | 
| VS |  vs | 
| XP |  XP | 
| XP |  XP | 
| DW |  DW | 
| FG |  FG | 
| JS | JSS | 
| RO |  RO | 
| GB | GWB | 
+1

しかし、その人がミドルネームを持っていたら? 2つの中間イニシャル(例:George H W Bush)はどうですか? –

+0

@TimBiegeleisen更新 – MT0

関連する問題