Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 为什么在选择从dual转换('@','','')时输出为null;以及为什么它是从dual的@at select replace('@','','','');_Sql_Oracle - Fatal编程技术网

Sql 为什么在选择从dual转换('@','','')时输出为null;以及为什么它是从dual的@at select replace('@','','','');

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'' ','

基本上,translate会将字符转换为字符,并将字符串替换为字符串,在这里,我尝试使用translate来删除空格以计算字数

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作为第三个参数的奇怪处理。我在我的回复中展示了这一点,当你写下你的回复时,我的回复已经发布了。