【问题标题】:Oracle regexp_replace - removing trailing spacesOracle regexp_replace - 删除尾随空格
【发布时间】:2019-04-05 02:24:13
【问题描述】:

我正在寻求有关从队列名称中删除尾随空格的帮助。以下是我正在使用的表格示例:

QUEUE_NAME
Queue A 
Queue B
Queue C 

我遇到的问题是队列名称末尾有一个额外的空格,并且在尝试以下代码时:

SELECT
 TRIM(TRAILING ' ' FROM QUEUE_NAME)
FROM
 TABLE_QUEUE;

空间还在。

我正在阅读来自 Google 的搜索,发现以下代码删除了特殊字符 [https://community.oracle.com/blogs/bbrumm/2016/12/11/how-to-replace-special-characters-in-oracle-sql],这删除了所有空格,包括末尾的空格。我写的代码:

SELECT
     REGEXP_REPLACE(QUEUE_NAME, '[^0-9A-Za-z]', '')
    FROM
     TABLE_QUEUE;

我现在唯一的问题是我的结果如下所示:

QUEUE_NAME
QueueA
QueueB
QueueC

我从未真正使用过 regexp_replace,因此不确定我需要对代码进行哪些更改以在队列名称之间留出空格,所以如果有人能就我如何解决这个问题提出建议,我将不胜感激。

提前致谢。

---- 代码编辑为不应包含[.!?]+

【问题讨论】:

  • 你确定它是空格而不是其他空白字符吗?
  • 嗨,Lukasz,公平地说,我不确定,只有当我将表格数据下载为 CSV 时,我才会在末尾看到一个额外的空间。有什么要我检查的吗?
  • 记事本++并显示不可见字符“查看->显示符号->显示所有字符”
  • 好的,谢谢你试试
  • 对于未来,最好能确定那些神秘人物是什么。你可以看看你是否运行select DUMP(queue_name) from table_queue。阅读一些有关 DUMP 功能的知识并使用它,您会发现它在很多场合都非常有用。

标签: sql oracle regexp-replace


【解决方案1】:

您可以尝试使用trim,仅在以下选择语句中:

with t(col0) as
(
 select ' Queue A  ' from dual union all
 select '   Queue B ' from dual union all
 select ' Queue C  ' from dual 
)
select trim(col0)
  from t;

trimmedText
-----------
Queue A
Queue B
Queue C

你周围没有空间。

【讨论】:

    【解决方案2】:

    您想从字符串末尾删除空格:

    regexp_replace(queue_name, '[[:space:]]+$', '')
    

    (模式中的“$”表示结束。)

    如果这仍然不起作用,那么您正在处理一些不被视为空间的奇怪隐形字符。使用

    regexp_replace(queue_name, '[^0-9A-Za-z]+$', '')
    

    相反,如您所知,它会删除除字母和数字之外的所有字符。 '$' 将其限制在字符串的末尾。

    【讨论】:

    • 您好,感谢您的回复。试过那个代码,最后还有空间
    • 好的,奇怪的不可见字符,那不被认为是空间。我已经更新了我的答案。
    • Thorsten,谢谢你,成功了。我添加的“$”已经解决了这个问题。太棒了。
    • 如果我想将其限制为字符串的开头和结尾,以供将来参考,这可能吗?正如我尝试的那样,REGEXP_REPLACE(QUEUE_NAME, '+^[^0-9A-Za-z]+$', '') 并没有奏效......
    • @MichaelOwen - + 号只表示子模式之后的东西,而不是它之前的东西。相反,您想要的是 `regexp_replace(queue_name, '^[^0-9A-Za-z]+|[^0-9A-Za-z]+$')。
    【解决方案3】:

    CHAR 类型的列(例如CHAR(8))总是在字段的整个宽度的右侧填充空白。因此,如果您将'Queue A' 存储在CHAR(8) 字段中,数据库会在其末尾添加一个空格,并且无法从列中删除该额外空格。解决方案是更改字段,使其定义为VARCHAR2(Oracle 中首选)或VARCHAR

    ALTER TABLE TABLE_QUEUE MODIFY QUEUE_NAME VARCHAR2(8);
    

    那么数据库将只存储你给它的字符,而不用空白填充字段。

    祝你好运。

    【讨论】:

      猜你喜欢
      • 2015-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-06
      • 1970-01-01
      • 2016-09-10
      • 2015-05-11
      相关资源
      最近更新 更多