为什么对偶的select translate('@','','')输出为null;以及为什么resulit是double中的select replace('@','','')处的@;

时间:2019-05-27 16:45:29

标签: sql oracle

基本上,翻译将字符转换为字符,将字符串替换为字符串,在这里我尝试使用翻译来删除空格以计算单词数。

select translate('  @',' ','') from dual;

select replace('  @',' ','') from dual;

select ename , nvl(length(replace(TRANSLATE(upper(trim(ename)),'ABCDEFGHIJKLMNOPQRSTUVWXYZ'' ','                           @ '),' ',''))+1,1) NOOFWORDs
from emp;

2 个答案:

答案 0 :(得分:1)

不幸的是,Oracle在空字符串与空字符串之间做出了许多奇怪的选择。

其中之一与TRANSLATE有关。如果任何参数(包括最后一个参数)为NULL,则TRANSLATE将返回NULL,无论 logical 行为应为什么。

因此,要使用TRANSLATE删除空格(例如),必须在第二个和第三个参数中都添加一个不想删除的字符。我添加了小写字母z,但是您可以添加任何内容(点,数字0等),只要确保在两个参数的开头都添加相同的字符即可。

... translate (input_string, 'z ', 'z')    ....

例如:

select translate('  @','z ','z') from dual;

TRANSLATE('@','Z','Z')
------------------------
@

答案 1 :(得分:1)

select translate('  @',' ','') from dual;

返回NULL,因为在Oracle中空字符串不幸产生NULL。因此,它等同于

SELECT translate('  @', ' ', NULL)
       FROM dual;

translate()在参数为null时返回NULL。实际上,这在"TRANSLATE"中有详细记录:

  

enter image description here

     

(...)

     

您不能为to_string使用空字符串来从返回值中删除from_string中的所有字符。 Oracle数据库将空字符串解释为null,如果此函数具有null参数,则它将返回null。

如果要替换一个字符,请像以前一样使用replace()。对于几个但不止一个字符,您可以嵌套replace()

但是,当您要替换很多字符时,这变得不便。在这种情况下,如果替换字符只是一个字符,或者使用字符类或替代字符的空字符串regexp_replace()可能会派上用场。

例如

SELECT regexp_replace('a12b478c01', '[0-9]', '')
       FROM dual;

替换所有数字,仅保留'abc'

SELECT regexp_replace('ABcc1233', 'c|3', '')
       FROM dual;

删除任何'3''c'并得到'AB12'。在你的例子中

SELECT regexp_replace('  @', ' ', '')
       FROM dual;

也可以工作并给您'@'。尽管在您的示例中,简单的replace()就足够了。