,而不是把這個成等價的CONCAT
表達的,我會提出一個解決方案,這也將:
- 將更多一點的話就結束條件,他們不大寫字母開頭的,除了第一個。例如:「Van den Heuvel」將成爲「Heuvel(Van den)」;
- 從開始和結束脩剪空格:這樣可以避免在開始或結束時使用空格存儲的名稱的奇怪效果。
- 如果沒有可以移動到括號內的單詞,則返回一個不變的名稱。這很有用,因爲您可以排除
where
子句並在結果集中包含所有名稱。
對於此任務,正則表達式派上用場:
select regexp_replace(trim(naam), '^(\S+(\s+[^A-Z]\S*)*)\s+(\S.*)$', '\3 (\1)')
from medewerkers
函數的最後一個參數是在展示時,有一個匹配所產生的格式相當的可讀性。
注:根據語言設置(即NLS_SORT,不區分大小寫的排序),它可能需要更多的參數添加到preg_replace
執行區分大小寫:
select regexp_replace(trim(naam), '^(\S+(\s+[^A-Z]\S*)*)\s+(\S.*)$', '\3 (\1)', 1, 0, 'c')
from medewerkers
這裏有一些測試案例:
select id, naam,
regexp_replace(trim(naam), '^(\S+(\s+[^A-Z]\S*)*)\s+(\S.*)$', '\3 (\1)')
as corrected
from (select 1 id, 'De Ridder' as naam from dual union
select 2, ' de Meester' from dual union
select 3, 'Smits' from dual union
select 4, 'Vandenborre ' from dual union
select 5, 'Van den Borre' from dual union
select 6, ' van der Meulen' from dual union
select 7, 'van ''t Oosten' from dual union
select 8, 'Van de Walle-Van der Meulen' from dual)
order by id;
輸出:
id | naam | corrected
---+-----------------------------+------------------
1 | De Ridder | Ridder (De)
2 | de Meester | Meester (de)
3 | Smits | Smits
4 | Vandenborre | Vandenborre
5 | Van den Borre | Borre (Van den)
6 | van der Meulen | Meulen (van der)
7 | van 't Oosten | Oosten (van 't)
8 | Van de Walle-Van der Meulen | Walle-Van der Meulen (Van de)
請注意,你可以做到這一點很好地與'REGEXP_REPLACE(N aam,'^(\ S +)\ s +(。*)$','\ 2(\ 1)')',然後您可以省略where子句。 – trincot
使用||是正常的。 CONCAT在這裏會很難看。 – Mottor
學習使用||更好並以「找到它的正常方式」進行連接。在Oracle中,'concat()'只能**接受兩個參數(只有Oracle知道爲什麼);如果您必須連接四個字符串,則需要使用'concat()'三次。 – mathguy