【问题标题】:Hidden character in SQL column value in oracleoracle中SQL列值中的隐藏字符
【发布时间】:2018-04-04 20:51:23
【问题描述】:

我在表格的列中有一个值,不知何故在字符串的末尾有一些隐藏字符。我看不到它或将其删除。字符串放在下面。我可以在这个字符串中看到的总字符是 25,但是当我检查它显示为 26 的字符串长度时。我尝试了 TRIM 函数,但认为它可能是一个空格,但事实并非如此。如何在 oracle 查询中从字符串中删除此类字符。实际上,我正在使用 regexp_replace 替换该字符串的某些部分,但由于这个问题,正则表达式无法匹配字符串中的最后一个数字来替换它之前的所有内容。

28/110/41492/171486/98122

这是我的正则表达式函数

regexp_replace(trim(ATTRIBUTE_VALUE), '(^|.*?/)' || '98122' || '(/|$)', 'replaced' || '\2', 1, 1)

【问题讨论】:

  • 你可以用select dump(attribute_value) from ...查看字符代码。
  • 这是我在那里看到的: Typ=1 Len=26: 50,56,47,49,49,48,47,52,49,52,57,50,47,49 ,55,49,52,56,54,47,57,56,49,50,50,2
  • 是的,\x02 = 文本开头 (STX) 位于末尾。您可以将 (/|$) 替换为 '(/|[^[:print:]]*$)',该字符将被匹配并捕获到第 2 组中。
  • 40 和 50 是数字的 ASCII 码。 2不是。所以这是最后一个字符。您可以这样删除它:update mytable set attribute_value = substr(attribute_value, 1, 25) where ....
  • 2 表示最后一个字符??它是如何输入到列值中的?我可以在 regex_replace 中使用这个 substr 吗?我需要在更新查询期间即时执行此操作。

标签: sql regex oracle replace trim


【解决方案1】:

分两步进行:

  1. 删除所有不可打印的字符
  2. 应用您的替换模式

这是:

regexp_replace
(
  regexp_replace(attribute_value, '[^[:print:]]'), -- printable string
  '(^|.*?/)' || '98122' || '(/|$)', -- search pattern
  'replaced' || '\2',  -- replace pattern
  1, -- position
  1 -- occurrence
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-06
    • 2017-10-09
    • 1970-01-01
    • 2013-11-04
    • 2016-04-08
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    相关资源
    最近更新 更多