sql - 过滤大表上的 SQL 数据错误的更好方法
问题描述
客户端输入的大JSON PAYLOAD之一。1000+ JSON PAYLOAD 的 ReceiptID 字段包含“NULL”/“some other word”而不是有效的 Blank/AlphaNumeric/Numeric。
现在使用以下基于 COALESCE 和 ISNULL 的两个查询来缩小较小的子集。但是,将这些过滤到新的dirtyRowTable 的最佳快速方法是什么,这将有助于要求客户重播相同的内容。
使用以下两个查询来查找包含错误数据的确切行。
--下面使用ISNULL的SQL,返回所有1000行
Select top 1000 EventStoreId,
isnull(JSON_VALUE(payload,'$.ReceiptId'),0) ReceiptId
from dbo.EventStore order by 1 desc
-- 另一个使用 COALESCE 的 SQL,只返回 512 行并且错误,因为第 513 行的值为 'NULL'。(错误:将 nvarchar 值“NULL”转换为数据类型 int 时,消息 245、级别 16、状态 1、第 16 行转换失败。)
Select top 1000 EventStoreId,
COALESCE(JSON_VALUE(payload,'$.ReceiptId'),0) ReceiptId
from dbo.EventStore order by 1 desc
解决方案
COALESCE()
-- 尽管是标准的 -- 有一个缺点是它对第一个参数进行了两次评估。因此,当第一个参数很重要时,ISNULL()
是 SQL Server 中更好的方法。
也就是说,ISNULL()
表达式的类型是第一个表达式的类型。所以,它返回一个字符串。编写代码的更好方法是避免隐式类型转换:
ISNULL(JSON_VALUE(payload, '$.ReceiptId'), N'0') ReceiptId
推荐阅读
- c# - IRedisDatabase ListAddToLeft 无法序列化对象
- html - Sas :查看器结果与输出相同
- bash - Bash:将包含逗号的数字打印到 csv 文件
- amazon-web-services - 使用 AWS CodeDeploy 转移流量时来自同一用户的后续请求转到不同 AWS lambda 版本的问题
- flutter - 错误:输入“列表”
' 不是类型 'List 的子类型 ' - amazon-web-services - Elasticache Redis 中启用集群模式的复制逻辑是什么?
- python - 值的 PANDAS 数据帧上的 NPV 计算
- python - Python SMTP 客户端 - sendmail 方法中的错误
- java - 无法运行 JavaFX 应用程序 jar
- .net - 包含外键后,角度对象变成数组