2011-03-31 64 views
19

在我的Oracle 10g數據庫,我想從表中字段的值刪除「空白字符」(空格,製表符,回車......)刪除「空格字符」。的Oracle PL/SQL:從一個字符串

TRANSLATE()要走的路?例如像:

MY_VALUE := TRANSLATE(MY_VALUE, 
    CHR(9) || CHR(10) || CHR(11) || CHR(12) || CHR(13) || ' ', ''); 

或者是還有什麼更好的選擇(像[:space:]在PHP PCRE)?

感謝您的任何忠告。

+2

順便說一句,你的'TRANSLATE'將不起作用,因爲你有NULL作爲第三個參數。你可以使用'TRANSLATE(my_value,'A'|| CHR(9)|| CHR(10)|| CHR(11)|| CHR(12)|| CHR(13)||'','A') ' – 2011-04-01 06:12:19

+1

你是對的,謝謝!哦,我愛甲骨文... :-P – 2011-04-01 08:28:16

+0

刪除在甲骨文的PL/SQL任何空格和表單 – 2016-05-23 13:04:00

回答

36

我會去REGEXP_REPLACE,雖然我不是100%肯定這是PL/SQL

my_value := regexp_replace(my_value, '[[:space:]]*',''); 
+0

我來試試,明天的工作,並會隨時向你通報。由於已經爲指向'REGEXP_REPLACE'(http://download.oracle.com/docs/cd/B19306_01/server。102/b14200/functions130.htm)。看起來這就是我所需要的,因爲它聲稱是「POSIX」兼容的,所以'[[:space:]]'應該被識別。 – 2011-03-31 20:34:36

+0

我確認這是有效的。 – 2011-04-01 08:29:28

2
select regexp_replace('This is a test ' || chr(9) || ' foo ', '[[:space:]]', '') from dual; 

REGEXP_REPLACE 
-------------- 
Thisisatestfoo 
6

既然你是舒適的使用正則表達式使用,您可能需要使用REGEXP_REPLACE函數。 [:空間:]如果你想消除任何比賽POSIX類

REGEXP_REPLACE(my_value, '[[:space:]]', '') 


SQL> ed 
Wrote file afiedt.buf 

    1 select '|' || 
    2   regexp_replace('foo ' || chr(9), '[[:space:]]', '') || 
    3   '|' 
    4* from dual 
SQL>/

'|'|| 
----- 
|foo| 

如果你想留在原地一個空間,每一套連續的空格字符,只需添加+正則表達式和使用作爲替代人物的空間。

with x as (
    select 'abc 123 234  5' str 
    from dual 
) 
select regexp_replace(str, '[[:space:]]+', ' ') 
    from x 
1

要刪除任何空格,您可以使用:

myValue := replace(replace(replace(replace(replace(replace(myValue, chr(32)), chr(9)), chr(10)), chr(11)), chr(12)), chr(13)); 

舉例:刪除所有空格中的表:

update myTable t 
    set t.myValue = replace(replace(replace(replace(replace(replace(t.myValue, chr(32)), chr(9)), chr(10)), chr(11)), chr(12)), chr(13)) 
where 
    length(t.myValue) > length(replace(replace(replace(replace(replace(replace(t.myValue, chr(32)), chr(9)), chr(10)), chr(11)), chr(12)), chr(13))); 

update myTable t 
    set t.myValue = replace(replace(replace(replace(replace(replace(t.myValue, chr(32)), chr(9)), chr(10)), chr(11)), chr(12)), chr(13)) 
where 
    t.myValue like '% %' 
+1

這是更高性能還是更好比這裏已經提出的基於正則表達式的解決方案? – 2012-11-07 11:11:53

11

較短的版本中:

REGEXP_REPLACE(my_value, '[[:space:]]', '') 

是:

REGEXP_REPLACE(my_value, '\s') 

無論上述聲明將消除 「空」 字。

要刪除「空」包住用如下語句替代

像這樣:

REPLACE(REGEXP_REPLACE(my_value, '\s'), CHR(0)) 
+0

感謝您的NULL刪除說明。真的需要這個東西。 – Reimius 2017-04-26 15:52:14

-1

由單個空格替換一個或多個空格,你應該使用{2,}代替*,否則你會insert空白的所有非空白字符之間。

REGEXP_REPLACE(my_value, '[[:space:]]{2,}', ' ') 
相關問題