【问题标题】:Escape underscore '_' in PostgreSQL trim() function?在 PostgreSQL trim() 函数中转义下划线'_'?
【发布时间】:2020-10-28 19:23:32
【问题描述】:

如何在 PostgreSQL trim() 函数中转义下划线'_'?

我尝试使用 trim() 函数从文本开头删除 'vt_'(例如 'vt_test' ):

select trim(leading 'vt_' from 'vt_test');
select ltrim('vt_test', 'vt_');
select ltrim('vt_test', 'vt\_');
select ltrim('vt_test', 'vt\\_');

返回:

est

但我想得到:

test

我可以使用 replace() 做到这一点,但我想知道为什么 trim() 不起作用。

在 Postgres 12 和 11 上测试。

摘要

  1. 函数trim 删除列出字符的所有前导实例 - 字符的顺序无关紧要。你得到相同的结果使用 trim(leading '_tv' from 'vt_test')
  2. 我认为,最好的解决方案是使用select regexp_replace('vt_test', '^vt_', ''),因为我只想在开头存在vt_ 的情况下删除这个前导字符串(对不起,但我之前没有提到它)。

感谢 a_horse_with_no_nameMureinikErwin Brandstetter 的帮助!

【问题讨论】:

  • 字符的顺序无关紧要。使用trim(leading '_tv' from 'vt_test') 得到相同的结果

标签: sql postgresql replace trim


【解决方案1】:

trim() 按预期工作:它删除了列出字符的 所有 个前导实例。 The manual:

trim([前导 | 尾随 | 两个] [字符] 来自字符串)

characters中删除仅包含字符的最长字符串 (默认为空格)从开头、结尾或两端(both 是 默认)的string

所以vt_t 被删除,而不仅仅是vt_

该问题与下划线_无关,在此上下文中没有特殊含义。

特定任务的最快替代方案:

SELECT right('vt_test', -3);

【讨论】:

    【解决方案2】:

    这里的问题不是逃避,ltrim 只是错误的工作工具。根据文档,此功能将

    从字符串的开头删除仅包含字符的最长字符串(默认为空格)。

    您可以使用regexp_replace 来获得想要的效果:

    select regexp_replace('vt_test', '^vt_', '')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-11
      相关资源
      最近更新 更多