设为首页 收藏本站
查看: 525|回复: 0

[经验分享] SQL Server中varchar类型值判断时遇到的一个问题

[复制链接]

尚未签到

发表于 2016-11-8 06:41:10 | 显示全部楼层 |阅读模式
前一段时间写了一个统计用着没问题,前几天看不对了,查了好几次了都没结果,今天又看了回,终于解决了。在这里记录一下。
  测试数据这里我就不贴了,主要是因为原始数据太大,模拟的数据又还原不了这个问题,就暂且记录下这个问题本身好了,有相同困惑的同僚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表一样的统计,所以用这种处理方式了)
  
 查询出来的结果是这样子的:
DSC0000.jpg

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

 
 表bb中的数据是这样子的:
DSC0002.jpg

 
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
 
查询出来的结果是这个样子滴:
  DSC0003.jpg
最后那一列出来了一个数据,而且是正确数据,这至少说明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
 
查询结果如下:
DSC0004.jpg

结果很正常,把“会议数量”列显示出来再查,结果如下:
DSC0005.jpg
结果又不对了。加上order by,结果跟上面加order by 效果相同。后来查连接字段的数据类型,都是varchar类型,两个表连接字段的数据也不存在空格情况,这就怪事儿了!
 
再后来随便乱改竟然改对了,只改了(S_Work_ID IS NOT NULL AND S_Work_ID <>'')的判断条件,这其改为:LEN(S_Work_ID)>0,再一测试竟然正常了。
DSC0006.jpg

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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-297046-1-1.html 上篇帖子: SQL Server 2005中的分区表(三):将普通表转换成分区表 (转) 下篇帖子: SQL Server数据库的数据汇总完全解析(WITH ROLLUP)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表