2017-10-13 13 views
1

我想連接我的table.my表中第一個字母的名字和姓氏。字段名是cname size varchar2(20)。 我的表是這樣的我想連接我的表中firstname和lastname的第一個字母?

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; 

,但我得到的輸出是這樣的:

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

我不知道那是因爲space.My預期輸出的是這樣的:

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

請幫忙。

+2

如果它們有兩個以上的名稱會發生​​什麼?例如:Dave Benson-Philips或耶穌H基督? – JohnHC

回答

0

我查詢

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

作品。

注意「和」之間的空間

什麼是你查詢反引號?

+0

這可能會導致中間名失敗,例如'約翰帕克史蒂文斯'。 –

+0

Thankyou.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 11g R2架構設置

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 

查詢1

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

但是如果這個人有一箇中間名呢?如何處理兩個中間名首字母(例如George H W Bush)? –

+0

@TimBiegeleisen更新 – MT0

相關問題