【问题标题】:Better way to filter out SQL data error on large table过滤大表上的 SQL 数据错误的更好方法
【发布时间】:2018-07-03 02:51:34
【问题描述】:

其中一个客户端输入的大JSON PAYLOAD。 1000+ JSON PAYLOAD 的 ReceiptID 字段包含“NULL”/“some other word”而不是有效的空白/AlphaNumeric/Numeric。

现在使用以下基于 COALESCE 和 ISNULL 的两个查询来缩小较小的子集。但是,将这些过滤到新的dirtyRowTable 的最佳快速方法是什么,这将有助于要求客户重播相同的内容。

使用以下两个查询来查找包含错误数据的确切行。

--下面的SQL使用ISNULL,返回所有1000行

Select top 1000 EventStoreId,  
                isnull(JSON_VALUE(payload,'$.ReceiptId'),0) ReceiptId
                from dbo.EventStore order by 1 desc

-- 下面的另一个使用 COALESCE 的 SQL,只返回 512 行,并且由于第 513 行的值为“NULL”而出错。 (错误:消息 245,级别 16,状态 1,第 16 行 将 nvarchar 值 'NULL' 转换为数据类型 int 时转换失败。)

Select top 1000 EventStoreId,  
                COALESCE(JSON_VALUE(payload,'$.ReceiptId'),0) ReceiptId
                from dbo.EventStore order by 1 desc

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    COALESCE()——虽然是标准的——但缺点是它对第一个参数求值两次。因此,当第一个参数很重要时,ISNULL() 是 SQL Server 中更好的方法。

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

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

    【讨论】:

    • 使用这两个查询来查找当前包含错误数据的确切行。有没有更好的方法来查找所有数据不良的人。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 2014-03-05
    • 2012-04-16
    • 2014-09-23
    相关资源
    最近更新 更多