【发布时间】: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 :) 我现在明白了。