示例:姓氏是 'Daniel Thomas Kon'
根據此條件預期輸出 - > 如果小于或等于 3,則將第一個單詞放在姓氏中,其余的將在名字中
這里的輸出將是 -
| 姓 | 名 |
|---|---|
| 丹尼爾 | 托馬斯·康 |
這里的輸出將是 -
| 姓 | 名 |
|---|---|
| 丹尼爾 | 托馬斯·康 |
uj5u.com熱心網友回復:
如果您希望最后一個或兩個單詞作為名字,前面的單詞作為姓氏,那么您可以在正則運算式中混合使用貪婪和非貪婪限定符:
SELECT REGEXP_SUBSTR(name, '^(\S (\s \S )*?)\s (\S (\s \S )?)$', 1, 1, NULL, 1) AS last_names,
REGEXP_SUBSTR(name, '^(\S (\s \S )*?)\s (\S (\s \S )?)$', 1, 1, NULL, 3) AS first_names
FROM table_name
或者,沒有正則運算式(輸入更多但會更快):
SELECT CASE
WHEN sep1 = 0 THEN name
WHEN sep_last2 = 0 THEN SUBSTR(name, 1, sep1 - 1)
ELSE SUBSTR(name, 1, sep_last2 - 1)
END AS last_names,
CASE
WHEN sep1 = 0 THEN NULL
WHEN sep_last2 = 0 THEN SUBSTR(name, sep1 1)
ELSE SUBSTR(name, sep_last2 1)
END AS first_names
FROM (
SELECT name,
INSTR(name, ' ', 1, 1) AS sep1,
INSTR(name, ' ', -1, 2) AS sep_last2
FROM table_name
)
其中,對于樣本資料:
CREATE TABLE table_name (name) AS
SELECT 'Daniel Thomas Kon' FROM DUAL UNION ALL
SELECT 'Abbot Alice' FROM DUAL UNION ALL
SELECT 'Baron Betty Beryl Becky' FROM DUAL UNION ALL
SELECT 'Count Carol Chloe Clara Carly' FROM DUAL;
兩個輸出:
| 姓氏 | FIRST_NAMES |
|---|---|
| 丹尼爾 | 托馬斯·康 |
| 方丈 | 愛麗絲 |
| 貝蒂男爵 | 綠柱石貝基 |
| 卡羅爾·克洛伊伯爵 | 克拉拉·卡莉 |
如果您想擁有最多 2 個姓氏,那么:
SELECT CASE
WHEN sep1 = 0 THEN name
WHEN sep3 = 0 THEN SUBSTR(name, 1, sep1 - 1)
ELSE SUBSTR(name, 1, sep2 - 1)
END AS last_names,
CASE
WHEN sep1 = 0 THEN NULL
WHEN sep3 = 0 THEN SUBSTR(name, sep1 1)
ELSE SUBSTR(name, sep2 1)
END AS first_names
FROM (
SELECT name,
INSTR(name, ' ', 1, 1) AS sep1,
INSTR(name, ' ', 1, 2) AS sep2,
INSTR(name, ' ', 1, 3) AS sep3
FROM table_name
)
哪個輸出:
| 姓氏 | FIRST_NAMES |
|---|---|
| 丹尼爾 | 托馬斯·康 |
| 方丈 | 愛麗絲 |
| 貝蒂男爵 | 綠柱石貝基 |
| 卡羅爾伯爵 | 克洛伊克拉拉卡莉 |
小提琴
uj5u.com熱心網友回復:
并非所有情況都可以從問題中清楚地看出,但下面的代碼執行以下操作
當長度 <=3 時將第一個單詞作為姓氏,否則使用前兩個單詞
如果長度 >= 3 則它將除名字之外的所有單詞作為名字
select
name,
case when regexp_count(name, '[^ ] ') <=3 then
REGEXP_SUBSTR(name,'\w ')
else REGEXP_SUBSTR(name,'\w \s \w ') end as last_name,
case when REGEXP_COUNT(name, '[^ ] ') >=3 then
trim(REGEXP_SUBSTR(name,'\s.*'))
else REGEXP_SUBSTR(name,'\w \s \w ') end as first_name
from table_name
uj5u.com熱心網友回復:
請檢查以下
DECLARE @Table VARCHAR(100) = 'Daniel Thomas Kon'
DECLARE @PartialString VARCHAR(100) = SUBSTRING(@Table, CHARINDEX(' ', @Table) 1, len(@Table))
SELECT CHARINDEX(' ', SUBSTRING(@Table, CHARINDEX(' ', @Table) 1, len(@Table))) 1
,CASE
WHEN (len(@Table) - len(replace(@Table, ' ', '')) 1) = 3
THEN SUBSTRING(@Table, CHARINDEX(' ', @Table) 1, len(@Table))
WHEN (len(@Table) - len(replace(@Table, ' ', '')) 1) > 3
THEN SUBSTRING(@PartialString, CHARINDEX(' ', @PartialString) 1, len(@PartialString))
END AS firstname
,CASE
WHEN (len(@Table) - len(replace(@Table, ' ', '')) 1) = 3
THEN SUBSTRING(@Table, 0, CHARINDEX(' ', @Table) 1)
WHEN (len(@Table) - len(replace(@Table, ' ', '')) 1) > 3
THEN SUBSTRING(@Table, 0, len(@PartialString) - 1)
END AS lastname
請檢查以下鏈接
https://dbfiddle.uk/BJbHD8J0
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/530315.html
標籤:sql甲骨文plsql
上一篇:在UIAction中對UIKit中的選單使用帶有選擇器的操作
下一篇:具有獨立反轉的Java排序
