jqkyp 发表于 2016-11-8 06:41:10

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 f2FROM 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 FROMTable31
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 f2FROM 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 FROMTable31
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 f2FROM 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 FROMTable31
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函数来判断就木有问题了呢?有知道原因的大侠看到了记得给咱留个信儿啊!不胜感激!
页: [1]
查看完整版本: SQL Server中varchar类型值判断时遇到的一个问题