sql - 旧值从 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 变量用于设置值。
谢谢
解决方案
你是对的,问题是这个表达式:ISNULL(IsVal,'')<>ISNULL(@IsVal,'')
当 IsVal 为 0 且 @IsVal 为 NULL 时,变为:
0 <> ''
它将作为整数进行比较,因此 '' 变为 0,您将得到:
0 <> 0
因此,在您的情况下,0、'' 和 NULL 都将被视为相等。您需要选择一个无效的 int(可能是 -1?)或将 0 转换为 varchar 来进行比较。
推荐阅读
- kubernetes - 这是否可以安排 CronJob 在每个 Kubernetes 节点上执行?
- sql - CASE WHEN THEN 如何处理 NULL 值
- checkbox - 无法获取要在复选框上显示的列特定时间戳
- leaflet - Leaflet + Turf 奇怪的 squareGrid 行为
- ruby - 有没有办法使用 Ruby 在 Centos 中使用 headless chromedriver 下载文件?
- python - 为什么 plt.scatter 会导致经常性错误
- xcode - 自动布局中的iOS垂直中心动态高度堆栈布局
- javascript - 如何使用 Twilio Whatsapp API 保存状态
- flutter - 在 Flutter 中的 Firestore 列表上方添加搜索表单
- java - 我应该修改什么以便浏览器让我可以选择保存返回的文件?