基本上,翻译将字符转换为字符,将字符串替换为字符串,在这里我尝试使用翻译来删除空格以计算单词数。
select translate(' @',' ','') from dual;
select replace(' @',' ','') from dual;
select ename , nvl(length(replace(TRANSLATE(upper(trim(ename)),'ABCDEFGHIJKLMNOPQRSTUVWXYZ'' ',' @ '),' ',''))+1,1) NOOFWORDs
from emp;
答案 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"中有详细记录:
(...)
您不能为
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()
就足够了。