2016-07-27 52 views
1

我有一個包含其中可能包含特殊字符的名稱列表的表:如何更換多個特殊字符的Postgres 9.5

id name 
1 Johän 
2 Jürgen 
3 Janna 
4 Üdyr 
... 

是否有替換的每個字符另外一個特定的功能? (不一定是不重要的)。類似這樣的:

SELECT id, function('ä,ü',name,'ae,ue'); 
Result: 

    id name 
    1 Johaen 
    2 Juergen 
    3 Janna 
    4 UEdyr 
    ... 
+0

的可能的複製[多個分割和分配順序\ _id](HTTP ://stackoverflow.com/questions/32640552/multiple-split-and-assign-order-id)檢查'TRANSLATE'部分。如何將每個字符轉換爲'' –

+0

@JuanCarlosOropeza這是一點點不同的任務 - 你不能使用'translate',因爲它只能用於單個字符。 –

回答

2

不,沒有這個功能。可能不難編寫優化的C擴展它是什麼。但是C語言並不總是必要的。您可以嘗試SQL或PLPGSQL功能:

CREATE OR REPLACE FUNCTION xx(text, text[], text[]) 
RETURNS text AS $$ 
    SELECT string_agg(coalesce($3[array_position($2, c)],c),'') 
     FROM regexp_split_to_table($1,'') g(c) 
$$ LANGUAGE sql; 

postgres=# select xx('Jürgen', ARRAY['ä','ü'], ARRAY['ae','ue']); 
┌─────────┐ 
│ xx │ 
╞═════════╡ 
│ Juergen │ 
└─────────┘ 
(1 row) 

在我的補償它的200ms下6000轉換(但我的PostgreSQL的開發版本 - 這是慢)。

+0

我想知道你的意思是'開發人員構建',你的意思是'生產構建'會更快?如果是這種情況,你能指點我什麼檢查,以提高建設速度。 –

+0

以防萬一:'array_position'是9.5+不可用[9.4](https://www.postgresql.org/docs/9.4/static/functions-array.html)但是,速度很快。 12000個隨機名稱。用'ARRAY ['a','e'],ARRAY ['ae','ue']'花了300毫秒 –

+0

這個問題的主題與PostgreSQL 9.5有關,所以我使用了9.5函數。我有開發人員建立與啓用斷言 - 有更多的內存檢查等等。當你從rpm使用Postgres,deb,...然後斷言應該被禁用。檢查:'show debug_assertions;' –

1

替換()

如果你只想來代替你可以使用函數替換一個或幾個字符(字符串文本,從文本到文本)替換所有出現在字符串的子串。替換函數可用於將一個字符替換爲幾個字符。

翻譯()

如果你想翻譯一些字母到其他字母,你可以將用戶的功能轉換(字符串文本,從文本到文本)中,在相匹配的字符串替換任何字符從中設置相應的字符。

一些數據一起玩:替換功能的

drop table if exists xyz; 

create table xyz (
    id serial not null, 
    name varchar(30) 
); 

insert into xyz (name) values 
    ('Juhänäo'), 
    ('Jürgüen'), 
    ('Dannäu'), 
    ('Übüdyr'); 

例子:

select replace(name, 'ä', 'a') from xyz; 

此函數替換字母與字母的名稱列。 Juhänäo成爲Juhanao。

select replace(name, 'ä', 'ae') from xyz; 

現在它用ae代替字母ä。

select replace(replace(replace(name, 'ä', 'ae'), 'ü', 'ue'), 'Ü', 'Ue') from xyz; 

不是很好,但在這個例子中,所有的都會變成ae,u變成ue,並且變成'Ue'。

update xyz set name = replace(replace(replace(name, 'ä', 'ae'), 'ü', 'ue'), 'Ü', 'Ue'); 

更改字母和更新行。更新的結果被以下:

實施例的
Juhaenaeo 
Juergueen 
Dannaeu 
Uebuedyr 

翻譯功能:

select translate(name, 'ä,ü,Ü', 'a,u,U') from xyz; 

轉換所有字母A到A,U到u和u到U.

update xyz set name = translate(name, 'ä,ü,Ü', 'a,u,U'); 

更新表,以便翻譯所有預定義的字母,並將更改保存到數據庫。更新的結果被以下:

Juhanao 
Jurguen 
Dannau 
Ubudyr 

的更多信息:

Replace characters with multi-character strings

Postgresql string functions