【问题标题】:Oracle RTRIM trims more than asked forOracle RTRIM 修剪超出要求
【发布时间】:2016-11-10 07:29:36
【问题描述】:

有谁知道为什么会这样:

SELECT RTRIM('123R_CLUSTER', '_CLUSTER') -- should give '123R' 
FROM DUAL;
SELECT RTRIM('123S_CLUSTER', '_CLUSTER') -- should give '123S' 
FROM DUAL;
SELECT RTRIM('123T_CLUSTER', '_CLUSTER') -- should give '123T'
FROM DUAL;
SELECT RTRIM('123U_CLUSTER', '_CLUSTER') -- should give '123U'
FROM DUAL;

返回 '123' 而不是预期的?

我使用的是 Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production。

当您尝试这些时,乐趣就开始了:

  • 将 123 替换为其他任何内容(没有更改仍然是错误的结果,即 多修剪一个字符),
  • 将“R”/“S”/“T”/“U”替换为其他任何内容,(工作正常)
  • 用其他任何东西替换“_CLUSTER”,(工作正常)
  • 在“_CLUSTER”之后添加任何内容(不变)。

【问题讨论】:

    标签: sql oracle oracle12c


    【解决方案1】:

    文档很清楚:

    Oracle/PLSQL RTRIM 函数从字符串的右侧删除所有指定的字符。

    所以它不会删除字符串末尾的 字符串 _CLUSTER - 它会删除字符,直到出现不是 _、C、L、U、S、T 的字符, E 或 R。由于您的后缀是 R/S/T/U,它们也匹配 rtrim 条件,并被删除。例如123S_SLURTE

    作为一个更容易理解的例子,

    rtrim('LK_123aababaabbbababbaa', 'ab') // returns LK_123
    

    rtrim 根本不是手头工作的工具 :)

    【讨论】:

    • 正是我想要发布的内容 :) 我想当您不确定或一段时间未使用给定结构时,您应该始终尝试检查文档
    • @przemo_pl 狡猾的部分是,它正是那种可以持续很长时间的错误——它很容易看起来几乎一直工作得很好。直到您对数据进行了看似完全不相关的微小更改,然后突然它完全中断,您甚至不知道从哪里寻找问题。哎哟。
    • 呃……谢谢。实际上,trim_string 的意思是“要修剪的单个字符的列表”,而不是“要修剪的字符串”。
    【解决方案2】:

    如果你想知道如何轻松做到这一点,试试这个:

    SELECT regexp_substr('123R_CLUSTER', '^(.*)_CLUSTER$', 1, 1, null, 1) from dual
    union all
    SELECT regexp_substr('123S_CLUSTER', '^(.*)_CLUSTER$', 1, 1, null, 1) from dual
    union all
    SELECT regexp_substr('123T_CLUSTER', '^(.*)_CLUSTER$', 1, 1, null, 1) from dual
    union all
    SELECT regexp_substr('123U_CLUSTER', '^(.*)_CLUSTER$', 1, 1, null, 1) from dual;
    

    产量

    REGEXP_SUBST
    ------------
    123R
    123S
    123T
    123U
    

    破译函数

    regexp_substr(
         '123T_CLUSTER',    -- source_field
         '^(.*)_CLUSTER$',  -- regular expression 
                            -- to capture all characters from start of
                            -- data up to "_CLUSTER"
         1,                 -- start looking at position 1 of string
         1,                 -- which occurance to return
         null,              -- used for match behaviour
         1)                 -- return what is in first set of parentheses
    

    【讨论】:

      猜你喜欢
      • 2023-03-03
      • 2020-10-29
      • 2019-06-04
      • 2021-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-14
      • 2013-07-31
      相关资源
      最近更新 更多