SQL Server中varchar类型值判断时遇到的一个有关问题
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中的数据是这样子的:
aa和bb中都是有数据的,一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函数来判断就木有问题了呢?有知道原因的大侠看到了记得给咱留个信儿啊!不胜感激!