首页 > 解决方案 > 过滤大表上的 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

标签: sqlsql-server

解决方案


COALESCE()-- 尽管是标准的 -- 有一个缺点是它对第一个参数进行了两次评估。因此,当第一个参数很重要时,ISNULL()是 SQL Server 中更好的方法。

也就是说,ISNULL()表达式的类型是第一个表达式的类型。所以,它返回一个字符串。编写代码的更好方法是避免隐式类型转换:

ISNULL(JSON_VALUE(payload, '$.ReceiptId'), N'0') ReceiptId

推荐阅读