SQL Server中varchar类型值判断时遇到的一个问题

前一段时间写了一个统计用着没问题,前几天看不对了,查了好几次了都没结果,今天又看了回,终于解决了。在这里记录一下。

测试数据这里我就不贴了,主要是因为原始数据太大,模拟的数据又还原不了这个问题,就暂且记录下这个问题本身好了,有相同困惑的同僚maybe可以参考下!

数据库版本:SQL Server 2005

SQL

 

SELECT     aa.f1 AS '序号', aa.f2 AS '工号', ISNULL(bb.f2, 0) AS '会议数量'
FROM         
(
SELECT     S_USER_ID AS f1, S_Work_ID AS f2  FROM S_USER
WHERE      (S_JOB_ID = 17) AND (S_Work_ID IS NOT NULL AND S_Work_ID <>'')
) AS aa 
LEFT JOIN
(
SELECT     field7 AS f1, COUNT(field1) AS f2 FROM  Table31
WHERE      (YEAR(field1) = YEAR(GETDATE())) AND (field7 IS NOT NULL) AND (field7 <> '') 
GROUP BY field7
) AS bb ON aa.f2 = bb.f1

(因为后面还有好多个类似于bb表一样的统计,所以用这种处理方式了)

 查询出来的结果是这样子的:


而实际上,表aa中的数据是这样子的:


 

 表bb中的数据是这样子的:


 

aabb中都是有数据的,一left join就没全成NULL,这不符合left join的“个性”啊。后来加了个order by,变成这个样子:

 

SELECT     aa.f1 AS '序号', aa.f2 AS '工号', ISNULL(bb.f2, 0) AS '会议数量'
FROM         
(
SELECT     S_USER_ID AS f1, S_Work_ID AS f2  FROM S_USER
WHERE      (S_JOB_ID = 17) AND (S_Work_ID IS NOT NULL AND S_Work_ID <>'')
) AS aa 
LEFT JOIN
(
SELECT     field7 AS f1, COUNT(field1) AS f2 FROM  Table31
WHERE      (YEAR(field1) = YEAR(GETDATE())) AND (field7 IS NOT NULL) AND (field7 <> '') 
GROUP BY field7
) AS bb ON aa.f2 = bb.f1
ORDER BY aa.f2

 

查询出来的结果是这个样子滴:

 

最后那一列出来了一个数据,而且是正确数据,这至少说明left join连接正确了,但是下面的4条为什么没有数据呢?

后来又弄了个新的测试,把bb表的f1(也就是table31中的工号)显示出来,“会议数量”列不显示,SQL如下:

SELECT     aa.f1 AS '序号', aa.f2 AS '工号',bb.f1 as '工号2'
--, ISNULL(bb.f2, 0) AS '会议数量'
FROM         
(
SELECT     S_USER_ID AS f1, S_Work_ID AS f2  FROM S_USER
WHERE      (S_JOB_ID = 17) AND (S_Work_ID IS NOT NULL AND S_Work_ID <>'')
) AS aa 
LEFT JOIN
(
SELECT     field7 AS f1, COUNT(field1) AS f2 FROM  Table31
WHERE      (YEAR(field1) = YEAR(GETDATE())) AND (field7 IS NOT NULL) AND (field7 <> '') 
GROUP BY field7
) AS bb ON aa.f2 = bb.f1

 

查询结果如下:


结果很正常,把“会议数量”列显示出来再查,结果如下:

结果又不对了。加上order by,结果跟上面加order by 效果相同。后来查连接字段的数据类型,都是varchar类型,两个表连接字段的数据也不存在空格情况,这就怪事儿了!

 

再后来随便乱改竟然改对了,只改了(S_Work_ID IS NOT NULL AND S_Work_ID <>'')的判断条件,这其改为:LEN(S_Work_ID)>0,再一测试竟然正常了。


这个问题很奇怪,varchar类型的字段本就可以用is not null<>''来判断有值,为什么我这这么写就出问题而且用了LEN函数来判断就木有问题了呢?有知道原因的大侠看到了记得给咱留个信儿啊!不胜感激!

猜你喜欢

转载自1017401036.iteye.com/blog/2188507