【问题标题】:Oracle / PLSQL: TRANSLATE Function - Why does this return NULL?Oracle / PLSQL:TRANSLATE 函数 - 为什么返回 NULL?
【发布时间】:2021-01-06 21:23:45
【问题描述】:

我是 Oracle / PLSQL 的新手,我正在使用 TRANSLATE 函数测试一些代码行。

场景 1:

DBMS_OUTPUT.put_line(TRANSLATE('27383', '0123456789', ' '));
DBMS_OUTPUT.put_line(LENGTH(TRANSLATE('27383', '0123456789', ' ')));

我得到的输出为:

NULL
NULL

场景 2:

DBMS_OUTPUT.put_line(TRANSLATE('2021 01 01', '0123456789', ' '));
DBMS_OUTPUT.put_line(LENGTH(TRANSLATE('2021 01 01', '0123456789', ' ')));

我得到的输出为:

5 space characters
5

我想,因为 to_string 是一个字符 ' '(空格),所以第一次出现的值被替换,其他值被从原始字符串中删除。

就像,在'2021 01 01' 中,'0' 被替换为' ',其余的数字字符被删除,使其成为一个包含 5 个空格字符的字符串(原来有 2 个空格加上替换后的 3 个空格)。

按照这个逻辑,在第一种情况下,'2' 应该替换为 ' ' 删除其他数字。剩下的应该是一个带有一个空格字符的字符串,但这不是正在发生的事情。

谁能解释一下这里发生了什么?

【问题讨论】:

  • 您的思维错误:By this logic, in the first scenario, '2' should be replaced with ' ' 这应该是 zero(第二个参数的第一个字符)而不是 two -> ... '0' should be replaced with ' ' 和第一个字符串没有零,所以你得到NULL
  • 尝试TRANSLATE('27383', '0123456789', 'ABCDEFGHIJ'),然后尝试TRANSLATE('27383', '0123456789', 'ABCD'),以更好地了解它在做什么。
  • 谢谢@MarmiteBomber!我又尝试了几个例子。现在我明白我必须将替换字符串中的剩余位置视为 NULL。
  • 谢谢@kfinity :) 我现在明白了。

标签: oracle plsql oracle11g


【解决方案1】:

把它想象成一对一的前/后值,我们需要一对一的所有东西

因此考虑:'0123456789',''

第一个字符串有10个“位置”,所以第二个字符串需要10个位置,即:

空格,null,null,null,null,null,null,null,null,null,

所以

  • 0 去太空
  • 1 为空
  • 2 为空

等等。

【讨论】:

  • 非常感谢!我现在明白它是如何工作的! ^_^
猜你喜欢
  • 2016-07-25
  • 1970-01-01
  • 2016-09-02
  • 1970-01-01
  • 2020-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多