【问题标题】:Oracle remove special charactersoracle去掉特殊字符
【发布时间】:2021-02-01 14:01:13
【问题描述】:

我在表 ident_nums 中有一个列,其中包含不同类型的 id。我需要从该列中删除特殊字符(例如 [.,/#&$-])并用空格替换它们;但是,如果在字符串的开头发现特殊字符,我需要将其删除而不放置空格。我尝试分步进行;首先,我删除了特殊字符并用空格替换它们(我用 REGEXP_REPLACE) 然后找到在字符串开头包含空格的记录,并尝试使用 TRIM 函数删除空格,但由于某种原因不起作用。

这是我所做的

Select regexp_replace(id_num, '[:(),./#*&-]', ' ') from ident_nums

这部分对我有用,我从列中删除了所有不需要的字符,但是,如果列中的字符串以我不想在其中有空格的字符开头,我只想删除该字符,所以我尝试使用内置函数TRIM。

update ident_nums
  set id_num = TRIM(id_num)

我收到错误 ORA-01407: can't update ident_nums.id_num to NULL

有什么想法我在这里做错了吗?

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

update ident_nums
  set id_num = TRIM(id_num) where id = 123;

但我需要用字符串开头的空格更新所有行。

欢迎提出任何建议。 或者如果它可以做得更好。 该表有数百万条记录。

谢谢

【问题讨论】:

  • 不工作是什么意思?
  • @dnoeth 修剪功能不会删除空白。
  • “特殊字符”是什么意思?
  • 显示你当前的 trim/regexp_replace。
  • 如果列 ID_NUM 仅包含空格(在用空格替换特殊字符之后),则 TRIM 将使其为空,因为 Oracle 认为空字符串为空。也许这是你的问题?

标签: sql regex oracle


【解决方案1】:

Regexp 有时会很慢,所以如果您可以使用内置函数来实现 - 请考虑一下。

正如@Abra 建议的那样,TRIM 和 TRANSLATE 是一个不错的选择,但也许您更喜欢 LTRIM - 仅删除字符串中的前导空格(TRIM 删除 - 前导和尾随字符)。如果要删除“空格”,可以省略定义修剪字符参数,空格是默认值。

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


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

【讨论】:

    【解决方案2】:

    Oracle 内置函数 TRANSLATETRIM 的组合对我有用。

    select trim(' ' from translate('#$one,$2-zero...', '#$,-.','     ')) as RESULT
      from DUAL
    

    参考这个dbfiddle

    【讨论】:

      【解决方案3】:

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

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

      regexp_replace() 可以只指定要保留的字符,这很方便。

      【讨论】:

      • @Abra 。 . .我现在。
      【解决方案4】:

      谢谢大家,这个查询对我有用

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

      【讨论】:

        【解决方案5】:

        这应该适合你。

        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
            )
        ) 
        

        【讨论】:

          猜你喜欢
          • 2014-08-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-04-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多