vBulletin Search Engine Optimization
| |||||||
| Register | FAQ | Members List | Calendar | Search | Today's Posts | Mark Forums Read |
| ||||
| Question. I have a new table that I am adding to a script that I wrote. This table has 3 fields, the first 2 fields are used in the on statement as being = other fields in the script. The first field always has data in it, but the 2nd field is sometimes null. So my problem is if both fields have data in them and they both match to the data in the fields that I am linking them to, then it returns the 3rd field without a problem. However if the 2nd field is null then it is returning a null for the 3rd field. I have checked and the field that I am linking to is null also. So if I have select t1.field1, t1.field2, t2.field1, t2.field2, t2.field3 from table1 t1 join table2 t2 on t1.field1=t2.field1 and t1.field2=t2.field2 with 2 records in each table table1: record1: data, data record2: data, null table2: record1: data,data,data record2: data,null,data what I get from the script is record1: data, data,data,data,data record2: data,null,data,null,null I would expect record2: data,null,data,null,data I hope this makes sense, I didn't want to post the entire actual script as it is about 150 lines long. Thanks in advance. |
| |||
| mike wrote: > I have a new table that I am adding to a script that I wrote. This > table has 3 fields, the first 2 fields are used in the on statement as > being = other fields in the script. > > The first field always has data in it, but the 2nd field is sometimes > null. > > So my problem is if both fields have data in them and they both match > to the data in the fields that I am linking them to, then it returns > the 3rd field without a problem. However if the 2nd field is null then > it is returning a null for the 3rd field. I have checked and the field > that I am linking to is null also. > > So if I have > > select t1.field1, t1.field2, t2.field1, t2.field2, t2.field3 > from table1 t1 > join table2 t2 > on t1.field1=t2.field1 and t1.field2=t2.field2 > > with 2 records in each table > table1: record1: data, data > record2: data, null > table2: record1: data,data,data > record2: data,null,data > > what I get from the script is > record1: data, data,data,data,data > record2: data,null,data,null,null > > > I would expect > record2: data,null,data,null,data Please use sample data like 'A', 'B', 'C', etc., instead of "data" which is much more confusing. Run some sanity checks on the data: select * from table1 where field2 is null select * from table1 where field2 = 'NULL' select * from table2 where field2 is null select * from table2 where field2 = 'NULL' What tool are you using to pull the data? Some clients (e.g. Crystal Reports) have a "convert nulls to empty values" option. |
| |||
| Yes using select statements like that does return the data where field2 is null. This is just using query analyzer. This is part of a view that I am making some changes to. Also I have tried using the SET ANSI_NULLS ON and SET ANSI_NULLS OFF and it made no difference. Ed Murphy wrote: > mike wrote: > > > I have a new table that I am adding to a script that I wrote. This > > table has 3 fields, the first 2 fields are used in the on statement as > > being = other fields in the script. > > > > The first field always has data in it, but the 2nd field is sometimes > > null. > > > > So my problem is if both fields have data in them and they both match > > to the data in the fields that I am linking them to, then it returns > > the 3rd field without a problem. However if the 2nd field is null then > > it is returning a null for the 3rd field. I have checked and the field > > that I am linking to is null also. > > > > So if I have > > > > select t1.field1, t1.field2, t2.field1, t2.field2, t2.field3 > > from table1 t1 > > join table2 t2 > > on t1.field1=t2.field1 and t1.field2=t2.field2 > > > > with 2 records in each table > > table1: record1: data, data > > record2: data, null > > table2: record1: data,data,data > > record2: data,null,data > > > > what I get from the script is > > record1: data, data,data,data,data > > record2: data,null,data,null,null > > > > > > I would expect > > record2: data,null,data,null,data > > Please use sample data like 'A', 'B', 'C', etc., instead of "data" which > is much more confusing. > > Run some sanity checks on the data: > > select * from table1 where field2 is null > select * from table1 where field2 = 'NULL' > > select * from table2 where field2 is null > select * from table2 where field2 = 'NULL' > > What tool are you using to pull the data? Some clients (e.g. Crystal > Reports) have a "convert nulls to empty values" option. |
| |||
| Oh yea, and one thing I forgot is that my join is a Left Outer, if I make it an inner join the records with the NULL just don't show at all. So the issue is within the linking. mike wrote: > Yes using select statements like that does return the data where field2 > is null. > This is just using query analyzer. This is part of a view that I am > making some changes to. > Also I have tried using the SET ANSI_NULLS ON and SET ANSI_NULLS OFF > and it made no difference. > > Ed Murphy wrote: > > mike wrote: > > > > > I have a new table that I am adding to a script that I wrote. This > > > table has 3 fields, the first 2 fields are used in the on statement as > > > being = other fields in the script. > > > > > > The first field always has data in it, but the 2nd field is sometimes > > > null. > > > > > > So my problem is if both fields have data in them and they both match > > > to the data in the fields that I am linking them to, then it returns > > > the 3rd field without a problem. However if the 2nd field is null then > > > it is returning a null for the 3rd field. I have checked and the field > > > that I am linking to is null also. > > > > > > So if I have > > > > > > select t1.field1, t1.field2, t2.field1, t2.field2, t2.field3 > > > from table1 t1 > > > join table2 t2 > > > on t1.field1=t2.field1 and t1.field2=t2.field2 > > > > > > with 2 records in each table > > > table1: record1: data, data > > > record2: data, null > > > table2: record1: data,data,data > > > record2: data,null,data > > > > > > what I get from the script is > > > record1: data, data,data,data,data > > > record2: data,null,data,null,null > > > > > > > > > I would expect > > > record2: data,null,data,null,data > > > > Please use sample data like 'A', 'B', 'C', etc., instead of "data" which > > is much more confusing. > > > > Run some sanity checks on the data: > > > > select * from table1 where field2 is null > > select * from table1 where field2 = 'NULL' > > > > select * from table2 where field2 is null > > select * from table2 where field2 = 'NULL' > > > > What tool are you using to pull the data? Some clients (e.g. Crystal > > Reports) have a "convert nulls to empty values" option. |
| |||
| Ok I finally got it. I still don't know why that didn't work. But here is what I did instead and it worked. On the join I changed it to the following. On t1.field1=t2.field1 and (case when t1.field2 is null then '' else t1.field2 end)=(case when t2.field2 is null then '' else t2.field2 end) mike wrote: > Oh yea, and one thing I forgot is that my join is a Left Outer, if I > make it an inner join the records with the NULL just don't show at all. > So the issue is within the linking. > > mike wrote: > > Yes using select statements like that does return the data where field2 > > is null. > > This is just using query analyzer. This is part of a view that I am > > making some changes to. > > Also I have tried using the SET ANSI_NULLS ON and SET ANSI_NULLS OFF > > and it made no difference. > > > > Ed Murphy wrote: > > > mike wrote: > > > > > > > I have a new table that I am adding to a script that I wrote. This > > > > table has 3 fields, the first 2 fields are used in the on statement as > > > > being = other fields in the script. > > > > > > > > The first field always has data in it, but the 2nd field is sometimes > > > > null. > > > > > > > > So my problem is if both fields have data in them and they both match > > > > to the data in the fields that I am linking them to, then it returns > > > > the 3rd field without a problem. However if the 2nd field is null then > > > > it is returning a null for the 3rd field. I have checked and the field > > > > that I am linking to is null also. > > > > > > > > So if I have > > > > > > > > select t1.field1, t1.field2, t2.field1, t2.field2, t2.field3 > > > > from table1 t1 > > > > join table2 t2 > > > > on t1.field1=t2.field1 and t1.field2=t2.field2 > > > > > > > > with 2 records in each table > > > > table1: record1: data, data > > > > record2: data, null > > > > table2: record1: data,data,data > > > > record2: data,null,data > > > > > > > > what I get from the script is > > > > record1: data, data,data,data,data > > > > record2: data,null,data,null,null > > > > > > > > > > > > I would expect > > > > record2: data,null,data,null,data > > > > > > Please use sample data like 'A', 'B', 'C', etc., instead of "data" which > > > is much more confusing. > > > > > > Run some sanity checks on the data: > > > > > > select * from table1 where field2 is null > > > select * from table1 where field2 = 'NULL' > > > > > > select * from table2 where field2 is null > > > select * from table2 where field2 = 'NULL' > > > > > > What tool are you using to pull the data? Some clients (e.g. Crystal > > > Reports) have a "convert nulls to empty values" option. |
| ||||
| mike wrote: > Ok I finally got it. I still don't know why that didn't work. Nulls are not considered equal to anything, not even other nulls. http://en.wikipedia.org/wiki/Null_(SQL) > But here is what I did instead and it worked. > On the join I changed it to the following. > > On t1.field1=t2.field1 and (case when t1.field2 is null then '' else > t1.field2 end)=(case when t2.field2 is null then '' else t2.field2 end) Equivalent and shorter: on t1.field1 = t2.field1 and coalesce(t1.field2,'') = coalesce(t2.field2,'') coalesce() is a function that takes one or more argument and returns the first non-null value among them, or null if they're all null. |