【问题标题】:How to get rightmost 10 places of a string in oracle如何在oracle中获取字符串的最右边10个位置
【发布时间】:2011-04-22 17:54:30
【问题描述】:

我正在尝试从 oracle 表中获取 id。类似于TN0001234567890345。我想要的是根据最右边的 10 个位置(例如4567890345)对值进行排序。我正在使用 Oracle 11g。有没有什么函数可以切掉Oracle SQL中最右边的10个地方?

提前致谢

提斯蒙

【问题讨论】:

  • 非常感谢 codaddict 和 Peter G 对我的帮助。它现在工作正常:)

标签: sql oracle sorting oracle11g


【解决方案1】:

您可以将SUBSTR 函数用作:

select substr('TN0001234567890345',-10) from dual;

输出:

4567890345

【讨论】:

  • +1。此外,第三个参数不是必需的:substr('TN0001234567890345',-10) 产生相同的结果。
  • 请注意,如果字符串少于 10 个字符,它将返回 NULL 而不是整个字符串。
  • @Stamm - 请参阅 Briguy37 的答案以获得处理它的简单解决方案......substr() 不能自动处理它真的太糟糕了......我绝对认为这是一个错误。
【解决方案2】:

codaddict 的解决方案在已知您的字符串至少与要修剪到的长度一样长的情况下有效。但是,如果您可以使用较短的字符串(例如,修剪到最后 10 个字符,并且要修剪的字符串之一是“abc”),则返回 null,这可能不是您想要的。

因此,这是稍微修改的版本,只要它们存在,无论长度如何,最右边的 10 个字符都将占用:

select substr(colName, -least(length(colName), 10)) from tableName;

【讨论】:

  • 这应该是公认的答案。双 reverse 可能会更短,因为这需要重复列名,所以如果列名是 3 个字符,则收支平衡......但是,我认为这更容易阅读。
【解决方案3】:

另一种方法虽然更乏味。使用REVERSESUBSTR 函数,如下所示:

SELECT REVERSE(SUBSTR(REVERSE('TN0001234567890345'), 1, 10)) FROM DUAL;

第一个 REVERSE 函数将返回字符串 5430987654321000NT

SUBSTR 函数将从第一个字符到第十个字符读取我们的新字符串 5430987654321000NT,这将返回 5430987654。

最后一个 REVERSE 函数将返回我们的原始字符串减去前 8 个字符,即 4567890345

【讨论】:

  • 请不要这样做。这是一种浪费。
  • 你为什么要这样做?
  • 如果字符串的长度恰好小于 10 个字符,那么从逻辑上讲,您会希望返回整个字符串。接受的答案返回 NULL 而这个在这种情况下有效。实际上,我不得不在工作中使用这个解决方案,因为我们有可变长度的字符串。
  • 1 是不必要的 - 省略它会得到相同的结果。
【解决方案4】:
SQL> SELECT SUBSTR('00000000123456789', -10) FROM DUAL;

结果:0123456789

【讨论】:

  • 虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提出问题的人。请edit您的回答添加解释并说明适用的限制和假设。
  • 还讨论了这比现有答案提供的好处,其中一些似乎对特殊情况有更多的保护。
【解决方案5】:

是的,这是一篇旧帖子,但由于有人出于某种原因对其进行了编辑,它出现在列表中,我很震惊没有包含正则表达式解决方案!因此,这是一个在 order by 子句中使用 regex_substr 的解决方案,只是为了徒劳的练习。正则表达式查看字符串中的最后 10 个字符:

with tbl(str) as (
  select 'TN0001239567890345' from dual union
  select 'TN0001234567890345' from dual
)
select str
from tbl
order by to_number(regexp_substr(str, '.{10}$'));

假设字符串的 ID 部分至少为 10 位。

【讨论】:

  • 由于正则表达式导致的过度复杂和缓慢是可以接受的,如果它可以解决简单使用 substr 的问题(返回 null 以获得较短的字符串)。因为它没有,所以这个解决方案是针对这个问题的最佳解决方案。
  • 哦,是的,我做到了,但我没有幽默感,但我认为其他人(Oracle 经验较少或英语不太熟练)可能会忽略或误解它,并认为答案是理所当然的。
  • @GolezTrol 好的,好的,我已经喝过咖啡了。
猜你喜欢
  • 2015-10-02
  • 1970-01-01
  • 2010-12-15
  • 1970-01-01
  • 1970-01-01
  • 2021-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多