在oracle中选择不等于空字符串的字段
在oracle中选择不等于空字符串的字段
我正在尝试编写一个查询,只选择所有非空的名称。以下两个查询都没有返回结果:
SELECT name FROM MyTable WHERE name != ''; SELECT name FROM MyTable WHERE name = '';
为了背景,以下两个查询确实返回结果:
SELECT name FROM MyTable WHERE name != 'a'; SELECT name FROM MyTable WHERE name IS NOT NULL;
我在某个地方看到空字符串在Oracle中等同于NULL,但我仍然不明白这解释了这种行为的原因。我需要支持SQL Server和Oracle,所以不能仅仅依赖于WHERE name IS NOT NULL
。
有人能解释一下这里发生了什么吗?谢谢!
在Oracle中,当进行包含NULL值的比较时,结果总是返回FALSE。这是由于NULL代表缺少数据,因此无法与任何值或另一个NULL值相等或不相等。
对于问题"Select fields not equal to the empty string in Oracle",出现了以下原因和解决方法。
原因:
在Oracle中,空字符串和NULL被视为不同的值。因此,当使用等于(=)或不等于(<>)运算符比较字段和空字符串时,无法正确地筛选出不等于空字符串的字段。
解决方法:
要解决这个问题,可以使用IS NULL或IS NOT NULL运算符来检查字段是否为空。但是,如果想要筛选出不等于空字符串的字段,需要使用特殊的比较方式。
以下是一种解决方法,使用COALESCE函数和LIKE运算符来筛选出不等于空字符串的字段:
SELECT * FROM your_table WHERE COALESCE(your_field, 'not_empty') <> 'not_empty';
上述查询语句将返回所有字段值不等于空字符串的记录。
另一种解决方法是使用NULLIF函数和LIKE运算符:
SELECT * FROM your_table WHERE NULLIF(your_field, '') IS NOT NULL;
上述查询语句也将返回所有字段值不等于空字符串的记录。
要在Oracle中选择不等于空字符串的字段,需要使用特殊的比较方式,如使用COALESCE函数或NULLIF函数结合LIKE运算符来实现。
在Oracle中,选择与空字符串不相等的字段的问题出现的原因是,Oracle将零长度的varchar视为NULL,而不是空字符串。当将''赋值给char(1)时,它变为' '(char类型是填充空格的字符串)。当将''赋值给varchar2(1)时,它变为'',这是一个零长度的字符串,在Oracle中零长度的字符串被视为NULL(不再是'')。从本质上讲,当将零长度的字符串插入到Varchar2列中时,它在Oracle中变为NULL。这与ANSI标准的规定相矛盾,但Oracle一直在按照自己的方式进行操作。
那么,''是一个零长度的字符串吗?
是的,如果在引号之间没有字符,则它是一个零长度的字符串。
但是,你在答案中说''不被视为NULL,而零长度的字符串被视为NULL。这到底是怎么回事?
这是从文章中剪切/粘贴的内容,Oracle的varchar中没有零长度的字符串。你可以通过以下快速测试来验证:DECLARE A VARCHAR(2); BEGIN A := ''; IF A = '' THEN dbms_output.put_line('Empty String'); ELSE dbms_output.put_line('It''s NULL'); END IF; IF '' = '' THEN dbms_output.put_line('Empty String'); ELSE dbms_output.put_line('It''s NULL'); END IF; END;
解决这个问题的方法是,使用IS NOT NULL或IS NULL来判断字段是否为空,而不是使用= ''或<> ''。
这个问题的出现源于Oracle将零长度的varchar视为NULL,而不是空字符串,因此需要在编写查询语句时注意使用正确的判断条件。