Sql 为什么在选择从dual转换('@','','')时输出为null;以及为什么它是从dual的@at select replace('@','','','');
基本上,translate会将字符转换为字符,并将字符串替换为字符串,在这里,我尝试使用translate来删除空格以计算字数Sql 为什么在选择从dual转换('@','','')时输出为null;以及为什么它是从dual的@at select replace('@','','','');,sql,oracle,Sql,Oracle,基本上,translate会将字符转换为字符,并将字符串替换为字符串,在这里,我尝试使用translate来删除空格以计算字数 select translate(' @',' ','') from dual; select replace(' @',' ','') from dual; select ename , nvl(length(replace(TRANSLATE(upper(trim(ename)),'ABCDEFGHIJKLMNOPQRSTUVWXYZ'' ','
select translate(' @',' ','') from dual;
select replace(' @',' ','') from dual;
select ename , nvl(length(replace(TRANSLATE(upper(trim(ename)),'ABCDEFGHIJKLMNOPQRSTUVWXYZ'' ',' @ '),' ',''))+1,1) NOOFWORDs
from emp;
不幸的是,Oracle在空字符串和空字符串之间做出了许多奇怪的选择 其中之一与翻译有关。如果TRANSLATE的任何参数(包括最后一个参数)为NULL,则TRANSLATE将返回NULL,无论逻辑行为如何 因此,要删除空格(比如使用TRANSLATE),必须在第二个和第三个参数中添加一个不希望删除的字符。我添加了小写字母z,但您可以添加任何内容,如点、数字0,等等,只要确保在两个参数的开头添加相同的字符即可
... translate (input_string, 'z ', 'z') ....
例如:
select translate(' @','z ','z') from dual;
TRANSLATE('@','Z','Z')
------------------------
@
不幸的是,Oracle在空字符串和空字符串之间做出了许多奇怪的选择 其中之一与翻译有关。如果TRANSLATE的任何参数(包括最后一个参数)为NULL,则TRANSLATE将返回NULL,无论逻辑行为如何 因此,要删除空格(比如使用TRANSLATE),必须在第二个和第三个参数中添加一个不希望删除的字符。我添加了小写字母z,但您可以添加任何内容,如点、数字0,等等,只要确保在两个参数的开头添加相同的字符即可
... translate (input_string, 'z ', 'z') ....
例如:
select translate(' @','z ','z') from dual;
TRANSLATE('@','Z','Z')
------------------------
@
返回NULL,因为在Oracle中,空字符串不幸会产生NULL。因此,它相当于
SELECT translate(' @', ' ', NULL)
FROM dual;
当参数为NULL时,translate返回NULL。事实上,这一点在以下文件中有很好的记录:
不能使用to_字符串的空字符串从返回值中删除from_字符串中的所有字符。Oracle数据库将空字符串解释为null,如果此函数具有null参数,则返回null
如果要替换一个字符,请使用已替换的字符。对于几个但不止一个字符,可以嵌套替换
然而,当您想要替换相当多的字符时,这会变得不方便。在这种情况下,如果替换字符仅为一个字符,或者使用字符类或替换字符的空字符串可能会派上用场
比如说
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;
也会工作并给你“@”。虽然在您的示例的简单情况下,一个简单的替换就足够了
返回NULL,因为在Oracle中,空字符串不幸会产生NULL。因此,它相当于
SELECT translate(' @', ' ', NULL)
FROM dual;
当参数为NULL时,translate返回NULL。事实上,这一点在以下文件中有很好的记录:
不能使用to_字符串的空字符串从返回值中删除from_字符串中的所有字符。Oracle数据库将空字符串解释为null,如果此函数具有null参数,则返回null
如果要替换一个字符,请使用已替换的字符。对于几个但不止一个字符,可以嵌套替换
然而,当您想要替换相当多的字符时,这会变得不方便。在这种情况下,如果替换字符仅为一个字符,或者使用字符类或替换字符的空字符串可能会派上用场
比如说
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;
也会工作并给你“@”。尽管在您的示例中,一个简单的替换就足够了。您能进一步解释一下,当任何参数为null时,为什么替换函数不会返回null吗?@Annapurna-只有Oracle可以解释这一点。正如我所说,他们做出了一些奇怪的、前后矛盾的选择。至少,这两个函数的行为都有文档记录。您能解释一下,当任何参数为null时,为什么replace函数不会返回null吗?@Annapurna-只有Oracle可以解释这一点。正如我所说,他们做出了一些奇怪的、前后矛盾的选择。至少,这两个函数的行为都有文档记录。对于几个字符,不应该嵌套要替换的调用。他们应该使用translate,但要小心,要考虑到NULL作为第三个参数的奇怪处理。我在我的回复中展示了这一点,当你写你的回复时,我已经发布了。对于几个字符,你不应该嵌套调用来替换。他们应该使用translate,但要小心,要考虑到NULL作为第三个参数的奇怪处理。我在我的回复中展示了这一点,当你写下你的回复时,我的回复已经发布了。