`

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函数来判断就木有问题了呢?有知道原因的大侠看到了记得给咱留个信儿啊!不胜感激!

  • 大小: 6.8 KB
  • 大小: 4.3 KB
  • 大小: 3 KB
  • 大小: 6.2 KB
  • 大小: 6.3 KB
  • 大小: 7.8 KB
  • 大小: 7.8 KB
分享到:
评论

相关推荐

    SQL Server中日期问题的解决

    在Microsoft SQL Server(以下简称SQL Server)中处理日期和时间时,经常会遇到一些挑战。由于SQL Server默认只提供`DATETIME`数据类型来存储日期和时间信息,这使得在某些情况下仅提取日期部分变得较为复杂。本文将...

    SQL Server 和 MySql 语法和关键字的区别——用于SQLServer到MySql的转换

    在 SQL Server 中,IFNULL 函数用于返回第一个参数不为空的值,而在 MySql 中,IFNULL 函数被称为 ISNULL 函数。例如,在 SQL Server 中,我们可以使用 IFNULL 函数来返回一个默认值,如果某个字段为空的话:`SELECT...

    在SQL Server2000中处理半个汉字的问题

    上述示例中的函数fn_TruncSemiHanzi接收一个varchar类型的参数,通过循环遍历字符串的每个字节,判断并处理可能出现的不完整汉字。函数内部首先将字符串转换为varbinary,然后逐字节检查,如果发现一个字节大于127,...

    SQL Server 中的数据类型隐式转换问题

    总的来说,本文深入探讨了SQL Server中的数据类型隐式转换问题,提醒我们在编写SQL语句时,尤其是涉及到数值计算和条件判断时,应确保数据类型的一致性和明确性,以防止不必要的数据损失和潜在的程序错误。...

    SQL server 实验报告

    学习者需要了解SQL Server中的数据类型,如INT、VARCHAR、DATE等,并掌握如何定义列、设置主键和约束,以及如何查看和管理已有的数据库对象。 2. **操作表数据**:实验中会涉及到如何插入、更新、查询和删除表中的...

    根据年月日生成编号sqlserver

    首先,我们创建了一个名为`test`的表,其中包含一个主键字段`iid`,类型为`varchar(32)`。接下来,向该表插入了多条记录,每条记录的`iid`字段值都是由日期(年月日)和一个递增的序号组成,例如`'2011120701'`表示...

    解决sql server保存对象字符串转换成uniqueidentifier失败的问题

    在SQL Server中,如果需要自动为新插入的行生成`uniqueidentifier`值,可以为列定义一个`DEFAULT`子句,或者在`INSERT`语句中显式调用`NEWID()`函数。例如: ```sql CREATE TABLE MyUniqueTable( UniqueColumn ...

    SQL Server自定义异常raiserror使用示例

    `raiserror`是SQL Server中用于生成错误消息的系统存储过程,它可以抛出一个自定义的错误,以便在执行过程中捕获并处理。下面是一个使用`raiserror`的例子: ```sql CREATE PROCEDURE my_sp_test @i INT, @...

    sql入门经典 pdf文档

    SQL-DMO(SQL Server Distributed Management Objects)是一个COM对象库,用于管理SQL Server实例。 **7.2 SQL-DMO的核心对象分层结构** SQL-DMO的核心对象包括服务器对象、数据库对象等。 **7.3 SQL-DMO应用初步...

    Microsoft SQL Server填充字符串的简单示例

    在SQL Server 2005至2008中,由于没有内置的`PADSTRING()`,我们通常使用`REPLICATE()`来重复一个字符,然后用`STUFF()`插入到原始字符串中,以达到填充的效果。 `REPLICATE()`函数接受两个参数:要重复的字符和...

    Sql Server 2005中查询用分隔符分割的内容中是否包含其中一个内容

    本问题讨论的是如何查询一个包含分隔值的字段,判断这些值中是否包含特定的子串。 例如,有一个产品分类表,其中`parent`字段存储了分类的层级关系,用分隔符(如`0`)来表示。例如,`parent`字段的值可能是`1A02B...

    sql查询中行列转换

    综上所述,行列转换是SQL中非常实用的一个技巧,可以帮助我们在数据分析时更加高效地处理数据。无论是在旧版本还是新版本的SQL Server中,都有多种方法可以实现这一目标。希望本文能够帮助读者更好地理解和掌握这一...

    pl/sql学习笔记

    异常处理是PL/SQL的另一个重要方面,它允许在遇到错误时优雅地处理问题。通过使用EXCEPTION关键字,开发者可以捕获并处理运行时错误,防止程序意外终止。 11. **%TYPE、%ROWTYPE ATTRIBUTE(PL/SQL)** `%TYPE`和`%...

    数据库动态生成列数据库纵向列转横向列

    而目标是要将这些数据转化为横向排列的形式,即每一行显示一个学生的所有科目成绩。 #### 解决方案 ##### 1. SQL Server 2000 在SQL Server 2000中,我们可以使用`CASE`语句结合`MAX`函数和`GROUP BY`来实现这一...

    必须会的SQL语句(五) NULL数据处理和类型转换

    在SQL Server中,数据处理和类型转换是两个非常重要的概念,尤其在处理复杂查询和数据清洗时显得至关重要。本文将详细讲解如何处理NULL数据以及如何进行类型转换。 NULL数据的处理是数据库操作中的常见问题,因为...

    程序员的SQL金典.pdf 高清 下载

    列是表中的一组相关数据项,每个列有一个名称和一个数据类型。例如,在员工表中,“姓名”、“年龄”和“工资”都是不同的列。 **1.2.4 数据类型(DataType)** 数据类型定义了可以存储在列中的数据种类。常见的...

    存储过程不支持数组类型的变通办法

    本文将深入探讨存储过程在处理批量删除操作时面临的问题,以及如何通过变通方法解决在SQL Server 2005中存储过程不支持数组类型参数的限制。 在早期的项目中,比如使用ASP开发网上商城与Access数据库配合,批量删除...

    数据库存储过程编写 参考手册

    函数类似于存储过程,但它必须返回一个值。在手册中,详细介绍了存储过程和函数的创建、调用、修改、参数定义及返回结果集的方法。 5. 游标处理:游标是用于逐行遍历查询结果集的数据库对象。游标允许用户在结果...

    数据库转换日期格式

    其中`target_data_type(length)`表示目标数据类型及其长度,`expression`是待转换的表达式,而`style`则是一个整数值,用于控制日期和时间的输出格式。 示例代码展示不同`style`值下的日期格式: ```sql -- 不同...

Global site tag (gtag.js) - Google Analytics