首页 > 解决方案 > 旧值从 null 更改为其他值时数据不来

问题描述

当我将值从 0 更改为 null 时,Select 语句不显示数据,反之亦然。但是当我将数据从 0 更改为 1 时,select 语句开始显示数据。

请找到我的代码(查询)

declare @tmptable TABLE (Id INT, IsVal BIT)
INSERT Into @tmptable VALUES(1,0)
--SELECT * FROM @tmptable
DECLARE @Id INT
DECLARE @IsVal BIT

SET @Id=1
SET @IsVal=NULL

select @Id as PrimaryKeyValue
,CAST(IsVal as VARCHAR) as OldValue,CAST(ISNULL(@IsVal,'') as VARCHAR) as NewValue
,'IsVal' AS DisplayFieldName,
CASE IsVal 
     WHEN 1 THEN 'Yes' 
     WHEN 0 THEN 'No'
     END  as DisplayOldValue
,CASE  @IsVal 
      WHEN 1 THEN 'Yes'
      WHEN 0 THEN 'No'
     END  as DisplayNewValue   
from @tmptable WHERE Id =@Id and ISNULL(IsVal,'')<>ISNULL(@IsVal,'')

声明有问题:-

ISNULL(IsVal,'')<>ISNULL(@IsVal,'')

无法弄清楚我需要对上述语句进行哪些更改,以便我的查询可以按我的意愿工作。请帮忙。

@IsVal 变量用于设置值。

谢谢

标签: sqlsql-serversql-server-2012

解决方案


你是对的,问题是这个表达式:ISNULL(IsVal,'')<>ISNULL(@IsVal,'')

当 IsVal 为 0 且 @IsVal 为 NULL 时,变为:

0 <> ''

它将作为整数进行比较,因此 '' 变为 0,您将得到:

 0 <> 0

因此,在您的情况下,0、'' 和 NULL 都将被视为相等。您需要选择一个无效的 int(可能是 -1?)或将 0 转换为 varchar 来进行比较。


推荐阅读