![]() | |
#1
| |||
| |||
|
#2
| |||
| |||
|
|
create table t1(c1 int, c2 varchar(10)) insert t1 values(1,'Hello') insert t1 values(2,'') insert t1 values(3,NULL) select * from t1 c1 c2 1 Hello 2 3 NULL select * from t1 where c2 = ' ' c1 c2 2 select * from t1 where ltrim(rtrim(c2)) is null c1 c2 3 NULL The last query should have result as following. However sql server 2000 does no list row c1 = 2. c1 c2 2 3 NULL |
#3
| |||
| |||
|
|
On 20 Mar, 06:28, othell... (AT) yahoo (DOT) com wrote: create table t1(c1 int, c2 varchar(10)) insert t1 values(1,'Hello') insert t1 values(2,'') insert t1 values(3,NULL) select * from t1 c1 c2 1 Hello 2 3 NULL select * from t1 where c2 = ' ' c1 c2 2 select * from t1 where ltrim(rtrim(c2)) is null c1 c2 3 NULL The last query should have result as following. However sql server 2000 does no list row c1 = 2. c1 c2 2 3 NULL Why would you think that the result of ltrim(rtrim(c2)) would be NULL when c2 is a non-null string? In fact the result is an empty string (not the same as NULL) so the answer you got is correct. The row where c1=2 should NOT be included. In SQL, NULL is not the same as an empty string. The only common exception that I know of is Oracle, which treats empty strings as NULLs. -- David Portas, SQL Server MVP Whenever possible please post enough code to reproduce your problem. Including CREATE TABLE and INSERT statements usually helps. State what version of SQL Server you are using and specify the content of any error messages. SQL Server Books Online:http://msdn2.microsoft.com/library/m...S,SQL.90).aspx --- Hide quoted text - - Show quoted text - |
#4
| |||
| |||
|
|
On Mar 20, 3:52 pm, "David Portas" REMOVE_BEFORE_REPLYING_dpor... (AT) acm (DOT) org> wrote: On 20 Mar, 06:28, othell... (AT) yahoo (DOT) com wrote: create table t1(c1 int, c2 varchar(10)) insert t1 values(1,'Hello') insert t1 values(2,'') insert t1 values(3,NULL) select * from t1 c1 c2 1 Hello 2 3 NULL select * from t1 where c2 = ' ' c1 c2 2 select * from t1 where ltrim(rtrim(c2)) is null c1 c2 3 NULL The last query should have result as following. However sql server 2000 does no list row c1 = 2. c1 c2 2 3 NULL Why would you think that the result of ltrim(rtrim(c2)) would be NULL when c2 is a non-null string? In fact the result is an empty string (not the same as NULL) so the answer you got is correct. The row where c1=2 should NOT be included. In SQL, NULL is not the same as an empty string. The only common exception that I know of is Oracle, which treats empty strings as NULLs. -- David Portas, SQL Server MVP Whenever possible please post enough code to reproduce your problem. Including CREATE TABLE and INSERT statements usually helps. State what version of SQL Server you are using and specify the content of any error messages. SQL Server Books Online:http://msdn2.microsoft.com/library/m...S,SQL.90).aspx --- Hide quoted text - - Show quoted text - If it is not null then it is definitely not 'any number of spaces' and match. select * from t1 where c2 = ' ' |
#5
| |||
| |||
|
|
If it is not null then it is definitely not 'any number of spaces' and match. select * from t1 where c2 = ' ' |
#6
| |||
| |||
|
|
On 20 Mar 2007 03:04:36 -0700, othell... (AT) yahoo (DOT) com wrote: (snip) If it is not null then it is definitely not 'any number of spaces' and match. select * from t1 where c2 = ' ' Hi othellomy, I'm not sure if I understand you correctly, but I assume that you are asking why a string of zero length ('') is considered equal to a string of spaces (' '). The reason is how ANSI has ruled that string comparisons in SQL should be carried out: the shorter string has to be padded with spaces to match the length of the longer string; after that, the strings are compared position by position. I know that this is not always the behaviour people expect and require. The expectation can be managed by understanding the rules for string comparisons. And the required behaviour of string comparisons can be gotten by using one of the followinmg two workarounds: DECLARE @a varchar(10), @b varchar(10); SET @a = 'abc'; SET @b = 'abc '; -- Workaround 1 IF @a = @b AND DATALENGTH(@a) = DATALENGTH(@b) PRINT 'They are equal!'; ELSE PRINT 'They are different!'; -- Workaround 2 IF @a + 'X' = @b + 'X' PRINT 'They are equal!'; ELSE PRINT 'They are different!'; -- Hugo Kornelis, SQL Server MVP My SQL Server blog:http://sqlblog.com/blogs/hugo_kornelis |
#7
| |||
| |||
|
|
SET @a = '' SET @b = ' ' if nullif(@a,'') is null and nullif(@b,'') is null PRINT 'They are equal!'; ELSE PRINT 'They are different!'; |
![]() |
| Thread Tools | |
| Display Modes | |
| |