2014-06-13 15 views
2

我有一個關於initcap的問題。 是否可以創建一個initcap語句來跳過小於4個字符的單詞更改。初始跳過小於4個字符的單詞

因爲我必須將少於4個字符的單詞改回正常,在完成initcap之後。
所以我認爲mabye有可能創建一個函數/過程/觸發器,只會跳過單詞?這些單詞被用在像「Son En Breugel」這樣的地名中,中間的「En」必須變得更低。
字符串的第一個字母並不需要改變,只有一個空格後的第一個小字(就像在字符串中間)


我開始創建一個過程,但它需要一點微調

的*不需要所有的字符串與INITCAP被改回改變
* INITCAP與xDutch格式

--Still需要找到方法來「s轉換」改變• ,我想我已經用這個腳本刪除了記錄?

有人可以幫助我嗎?

create or replace PROCEDURE Location_Name_Routine IS 
    BEGIN 
     DELETE 
      FROM Location 
      WHERE Name LIKE '%[^0-9a-zA-Z]%'; 
     UPDATE Location 
      set Name = nls_initcap(Name, 'NLS_SORT=xDutch'); 
     UPDATE Location 
      SET Name = REGEXP_REPLACE(Name,' En',' en'); 
     UPDATE Location 
      SET Name = REGEXP_REPLACE(Name,' Van',' van'); 
     UPDATE Location 
      SET Name = REGEXP_REPLACE(Name,' De',' de'); 
     UPDATE Location 
      SET Name = REGEXP_REPLACE(Name,' Den',' den'); 
     UPDATE Location 
      SET Name = REGEXP_REPLACE(Name,' Over','over'); 
     UPDATE Location 
      SET Name = REGEXP_REPLACE(Name,' Aan',' aan'); 
     UPDATE Location 
      SET Name = REGEXP_REPLACE(Name,' Bij',' bij');  
    END;  
+0

不應該'兒子'被轉換爲'兒子',因爲它也低於4個字符,或者你只想要像'en','van'這樣的具體詞彙保持不變? – Emmanuel

+0

沒有忘記注意,因爲字符串的第一個字母沒有。剛編輯我的問題。我只想要特定的詞不變 – Isene112

回答

2

對潛在問題可能沒有簡單的答案。我假設你正在嘗試正確地使用荷蘭語的地址,這個問題與昨天的this other question有關。

結合的問題,至少有三個特殊情況至今:

'S GRAVENHAGE => 's Gravenhage 
IJSLAND   => IJsland 
SON EN BREUGEL => Son en Breugel 

INITCAP甚至NLS_INITCAP('...', 'NLS_SORT=xDutch')未能妥善處理。在開始編碼之前,您應該收集所有要求。這些是荷蘭大寫字母的唯一規則,還是還有更多?

到目前爲止發佈的答案可能有助於解決一個特定的例外。但是,你不可能簡單地結合正則表達式並解決所有問題。您可能想在這裏採取更自上而下的方法。


UPDATE

基於wolφi的idead,可以使用所有現有的名稱來暴力破解的問題。 95%的時間單獨工作。使用this link電子表格中的431名稱,可以構建一個包含所有25個特例的列表。

運行該語句一次,以建立一個DECODE表達式來處理所有非平凡的情況:

--Build decode for UPDATE. 
select 
    --Start the decode 
    'decode(upper(name),'|| 
    --List all the exceptions. Single quotes are a mess, no way around it. 
    listagg(
    --Upper case version to match 
    ''''||upper(replace(column_value, '''', ''''''))|| 
    --Pre-defined init-capped version 
    ''','''||replace(column_value, '''', '''''')||'''' 
    , ','||chr(10) 
) 
    within group (order by column_value) 
    || 
    --Default to NLS_INITCAP 
    ',nls_initcap(name, ''NLS_SORT=xDutch''))' 
from table(sys.odcivarchar2list('Bellingwedde','Menterwolde','Oldambt','Pekela','Stadskanaal','Veendam','Vlagtwedde','Appingedam','Delfzijl','Loppersum','Bedum','Ten Boer','Eemsmond','Groningen','Grootegast','Haren','Hoogezand-Sappemeer','Leek','De Marne','Marum','Slochteren','Winsum','Zuidhorn','Achtkarspelen','Ameland','het Bildt','Boarnsterhim','Dantumadiel','Dongeradeel','Ferwerderadiel','Franekeradeel','Harlingen','Kollumerland en Nieuwkruisland','Leeuwarden','Leeuwarderadeel','Littenseradiel','Menaldumadeel','Schiermonnikoog','Terschelling','Tytsjerksteradiel','Vlieland','Bolsward','Gaasterlân-Sleat','Lemsterland','Nijefurd','Sneek','Wûnseradiel','Wymbritseradiel','Heerenveen','Ooststellingwerf','Opsterland','Skarsterlân','Smallingerland','Weststellingwerf','Aa en Hunze','Assen','Midden-Drenthe','Noordenveld','Tynaarlo','Borger-Odoorn','Coevorden','Emmen','Hoogeveen','Meppel','Westerveld','De Wolden','Dalfsen','Hardenberg','Kampen','Ommen','Staphorst','Steenwijkerland','Zwartewaterland','Zwolle','Deventer','Olst-Wijhe','Raalte','Almelo','Borne','Dinkelland','Enschede','Haaksbergen','Hellendoorn','Hengelo','Hof van Twente','Losser','Oldenzaal','Rijssen-Holten','Tubbergen','Twenterand','Wierden','Apeldoorn','Barneveld','Ede','Elburg','Epe','Ermelo','Harderwijk','Hattem','Heerde','Nijkerk','Nunspeet','Oldebroek','Putten','Scherpenzeel','Voorst','Wageningen','Buren','Culemborg','Geldermalsen','Lingewaal','Maasdriel','Neder-Betuwe','Neerijnen','Tiel','West Maas en Waal','Zaltbommel','Aalten','Berkelland','Bronckhorst','Brummen','Doetinchem','Lochem','Montferland','Oost Gelre','Oude IJsselstreek','Winterswijk','Zutphen','Arnhem','Beuningen','Doesburg','Druten','Duiven','Groesbeek','Heumen','Lingewaard','Millingen aan de Rijn','Nijmegen','Overbetuwe','Renkum','Rheden','Rijnwaarden','Rozendaal','Ubbergen','Westervoort','Wijchen','Zevenaar','Almere','Dronten','Lelystad','Noordoostpolder','Urk','Zeewolde','Abcoude','Amersfoort','Baarn','De Bilt','Breukelen','Bunnik','Bunschoten','Eemnes','Houten','IJsselstein','Leusden','Loenen','Lopik','Maarssen','Montfoort','Nieuwegein','Oudewater','Renswoude','Rhenen','De Ronde Venen','Soest','Utrecht','Utrechtse Heuvelrug','Veenendaal','Vianen','Wijk bij Duurstede','Woerden','Woudenberg','Zeist','Andijk','Anna Paulowna','Drechterland','Enkhuizen','Harenkarspel','Den Helder','Hoorn','Koggenland','Medemblik','Niedorp','Opmeer','Schagen','Stede Broec','Texel','Wervershoof','Wieringen','Wieringermeer','Zijpe','Alkmaar','Bergen (NH.)','Heerhugowaard','Heiloo','Langedijk','Schermer','Beverwijk','Castricum','Heemskerk','Uitgeest','Velsen','Bloemendaal','Haarlem','Haarlemmerliede en Spaarnwoude','Heemstede','Zandvoort','Wormerland','Zaanstad','Aalsmeer','Amstelveen','Amsterdam','Beemster','Diemen','Edam-Volendam','Graft-De Rijp','Haarlemmermeer','Landsmeer','Oostzaan','Ouder-Amstel','Purmerend','Uithoorn','Waterland','Zeevang','Blaricum','Bussum','Hilversum','Huizen','Laren','Muiden','Naarden','Weesp','Wijdemeren','Hillegom','Kaag en Braassem','Katwijk','Leiden','Leiderdorp','Lisse','Noordwijk','Noordwijkerhout','Oegstgeest','Teylingen','Voorschoten','Zoeterwoude','''s-Gravenhage','Leidschendam-Voorburg','Pijnacker-Nootdorp','Rijswijk','Wassenaar','Zoetermeer','Delft','Midden-Delfland','Westland','Alphen aan den Rijn','Bergambacht','Bodegraven','Boskoop','Gouda','Nieuwkoop','Reeuwijk','Rijnwoude','Schoonhoven','Vlist','Waddinxveen','Albrandswaard','Barendrecht','Bernisse','Binnenmaas','Brielle','Capelle aan den IJssel','Cromstrijen','Dirksland','Goedereede','Hellevoetsluis','Korendijk','Krimpen aan den IJssel','Lansingerland','Maassluis','Middelharnis','Nederlek','Oostflakkee','Oud-Beijerland','Ouderkerk','Ridderkerk','Rotterdam','Rozenburg','Schiedam','Spijkenisse','Strijen','Vlaardingen','Westvoorne','Zuidplas','Alblasserdam','Dordrecht','Giessenlanden','Gorinchem','Graafstroom','Hardinxveld-Giessendam','Hendrik-Ido-Ambacht','Leerdam','Liesveld','Nieuw-Lekkerland','Papendrecht','Sliedrecht','Zederik','Zwijndrecht','Hulst','Sluis','Terneuzen','Borsele','Goes','Kapelle','Middelburg','Noord-Beveland','Reimerswaal','Schouwen-Duiveland','Tholen','Veere','Vlissingen','Bergen op Zoom','Breda','Drimmelen','Etten-Leur','Geertruidenberg','Halderberge','Moerdijk','Oosterhout','Roosendaal','Rucphen','Steenbergen','Woensdrecht','Zundert','Aalburg','Alphen-Chaam','Baarle-Nassau','Dongen','Gilze en Rijen','Goirle','Hilvarenbeek','Loon op Zand','Oisterwijk','Tilburg','Waalwijk','Werkendam','Woudrichem','Bernheze','Boekel','Boxmeer','Boxtel','Cuijk','Grave','Haaren','''s-Hertogenbosch','Heusden','Landerd','Lith','Maasdonk','Mill en Sint Hubert','Oss','Schijndel','Sint Anthonis','Sint-Michielsgestel','Sint-Oedenrode','Uden','Veghel','Vught','Asten','Bergeijk','Best','Bladel','Cranendonck','Deurne','Eersel','Eindhoven','Geldrop-Mierlo','Gemert-Bakel','Heeze-Leende','Helmond','Laarbeek','Nuenen, Gerwen en Nederwetten','Oirschot','Reusel-De Mierden','Someren','Son en Breugel','Valkenswaard','Veldhoven','Waalre','Beesel','Bergen (L.)','Gennep','Horst aan de Maas','Mook en Middelaar','Peel en Maas','Venlo','Venray','Echt-Susteren','Leudal','Maasgouw','Nederweert','Roerdalen','Roermond','Weert','Beek','Brunssum','Eijsden','Gulpen-Wittem','Heerlen','Kerkrade','Landgraaf','Maastricht','Margraten','Meerssen','Nuth','Onderbanken','Schinnen','Simpelveld','Sittard-Geleen','Stein','Vaals','Valkenburg aan de Geul','Voerendaal')) 
where column_value <> nls_initcap(column_value, 'NLS_SORT=xDutch'); 

使用從該聲明的結果建立一個UPDATE這樣的:

--Update names to properly init-capped name, as defined by: 
--http://epp.eurostat.ec.europa.eu/portal/page/portal/nuts_nomenclature/local_administrative_units 
update location 
set name = 
    decode(upper(name),'''S-GRAVENHAGE','''s-Gravenhage', 
    '''S-HERTOGENBOSCH','''s-Hertogenbosch', 
    'AA EN HUNZE','Aa en Hunze', 
    'ALPHEN AAN DEN RIJN','Alphen aan den Rijn', 
    'BERGEN (NH.)','Bergen (NH.)', 
    'BERGEN OP ZOOM','Bergen op Zoom', 
    'CAPELLE AAN DEN IJSSEL','Capelle aan den IJssel', 
    'GILZE EN RIJEN','Gilze en Rijen', 
    'HAARLEMMERLIEDE EN SPAARNWOUDE','Haarlemmerliede en Spaarnwoude', 
    'HOF VAN TWENTE','Hof van Twente', 
    'HORST AAN DE MAAS','Horst aan de Maas', 
    'KAAG EN BRAASSEM','Kaag en Braassem', 
    'KOLLUMERLAND EN NIEUWKRUISLAND','Kollumerland en Nieuwkruisland', 
    'KRIMPEN AAN DEN IJSSEL','Krimpen aan den IJssel', 
    'LOON OP ZAND','Loon op Zand', 
    'MILL EN SINT HUBERT','Mill en Sint Hubert', 
    'MILLINGEN AAN DE RIJN','Millingen aan de Rijn', 
    'MOOK EN MIDDELAAR','Mook en Middelaar', 
    'NUENEN, GERWEN EN NEDERWETTEN','Nuenen, Gerwen en Nederwetten', 
    'PEEL EN MAAS','Peel en Maas', 
    'SON EN BREUGEL','Son en Breugel', 
    'VALKENBURG AAN DE GEUL','Valkenburg aan de Geul', 
    'WEST MAAS EN WAAL','West Maas en Waal', 
    'WIJK BIJ DUURSTEDE','Wijk bij Duurstede', 
    'HET BILDT','het Bildt', 
    nls_initcap(name, 'NLS_SORT=xDutch')); 
+0

謝謝你的回答, 是的,你是正確的,它適當地大寫地址在荷蘭。 這有點讓我頭痛,首先我會試着把注意力集中在Son En Breugel的'En'這樣的中間單詞上。 但也有一個名字,如Alpen Aan De Rijn,必須成爲Alpen aan de Rijn而沒有中間首都。 這就是優先1 – Isene112

+0

請參閱我的編輯,你有一些sugestions? – Isene112