Sql 删除特殊字符

Sql 删除特殊字符,sql,regex,oracle,Sql,Regex,Oracle,我在包含不同类型ID的表ident_nums中有一列。我需要删除特殊字符se.g。[,/&$-]并用空格替换;但是,如果在字符串的开头找到特殊字符,我需要删除它,而不需要放置空格。我试着循序渐进;首先,我删除了特殊字符,并用我使用的空格替换它们 然后,REGEXP_REPLACE找到了字符串开头包含空格的记录,并尝试使用TRIM函数删除空白,但由于某种原因,该功能无法正常工作 这就是我所做的 Select regexp_replace(id_num, '[:(),./#*&-]', '

我在包含不同类型ID的表ident_nums中有一列。我需要删除特殊字符se.g。[,/&$-]并用空格替换;但是,如果在字符串的开头找到特殊字符,我需要删除它,而不需要放置空格。我试着循序渐进;首先,我删除了特殊字符,并用我使用的空格替换它们 然后,REGEXP_REPLACE找到了字符串开头包含空格的记录,并尝试使用TRIM函数删除空白,但由于某种原因,该功能无法正常工作

这就是我所做的

Select regexp_replace(id_num, '[:(),./#*&-]', ' ') from ident_nums
这部分对我来说很有用,我从列中删除了所有不需要的字符,但是,如果列中的字符串以一个字符开头,我不想在其中留有空格,我只想删除该字符,所以我尝试使用内置函数TRIM

update ident_nums
  set id_num = TRIM(id_num)
我收到错误ORA-01407:无法将ident_nums.id_num更新为NULL

你知道我做错了什么吗

如果我添加where子句,它确实有效

update ident_nums
  set id_num = TRIM(id_num) where id = 123;
但是我需要用字符串开头的空白来更新所有行

欢迎提出任何建议。 或者是否可以做得更好。 这个表有数百万条记录


感谢您

Oracle内置功能的组合并为我工作

从翻译“$1,$2-zero…”、“$,-”、“”中选择修剪“”,作为结果 来自双重 参考此

我认为修剪是关键,但如果您只想保留字母数字、数字和空格,那么:

select trim(' ' from regexp_replace(col, '[^a-zA-Z0-9 ]', ' ', 1, 0))

ReExpExchange允许只指定要保留的字符,这可能是方便的。

ReGEXP有时会很慢,因此如果您可以使用内置函数来完成它,请考虑它。

正如@Abra所建议的,TRIM和TRANSLATE是一个不错的选择,但您可能更喜欢LTRIM-从字符串TRIM中只删除前导空格-同时删除前导字符和尾随字符。如果要删除空格,可以通过定义修剪字符参数来删除空格,默认为空格

select 
     ltrim(translate('#kdjdj:', '[:(),./#*&-]', ' ')) 
from dual;


select 
     ltrim(translate(orginal_string, 'special_characters_to_remove', ' ')) 
from dual;

谢谢大家,这个问题对我有用吗

update update ident_nums
  set id_num = LTRIM(REGEXP_REPLACE(id_num, '[:space:]+', ' ') 
  where REGEXP_LIKE(id_num, '^[ ?]')

这应该对你有用

SELECT id_num, length(id_num) length_old, NEW_ID_NUM, length(NEW_ID_NUM) len_NEW_ID_NUM, ltrim(NEW_ID_NUM), length(ltrim(NEW_ID_NUM)) length_after_ltrim
FROM (
    SELECT id_num, regexp_replace(id_num, '[:(),./#*&-@]', ' ') NEW_ID_NUM FROM 
    (
        SELECT '1234$%45' as id_num from dual UNION 
        SELECT '@SHARMA' as id_num from dual UNION 
        SELECT 'JACK TEST' as id_num from dual UNION 
        SELECT 'XYZ#$' as id_num from dual UNION 
        SELECT '@ABCDE()' as id_num from dual   -- THe 1st character is space
    )
) 

什么不起作用?@dnoeth trim函数不会删除空白。特殊字符是什么意思?显示当前trim/regexp\u replace。如果列ID\u NUM在用空格替换特殊字符后仅包含空格,则trim将使其为空,因为Oracle将空字符串视为空字符串。也许这就是你的问题?@Abra。我现在是。