【问题标题】:Why does this SQL Case statement return a null in some instances? [duplicate]为什么此 SQL Case 语句在某些情况下返回 null? [复制]
【发布时间】:2014-10-05 19:44:26
【问题描述】:

我正在使用这个脚本来生成一些数据

select case abs(checksum(newid())) % 5 + 1
                    when 1 then 'excellent'
                    when 2 then 'good'
                    when 3 then 'fair'
                    when 4 then 'poor'
                    when 5 then 'failing'
                    end

它返回这些值:excellent,good,fair,poor,failing,null

我以为我得到了1,2,3,4,5 之外的结果,导致null 从案例中返回。所以我执行了这个脚本:

select abs(checksum(newid())) % 5 + 1

它只返回这些值:1,2,3,4,5

假设由于一些异常的统计现象(因为我运行了语句 > 100 次)在调试期间我没有得到 0 或 6,那么还有其他一些问题导致了这种情况。

【问题讨论】:

标签: sql sql-server random case


【解决方案1】:

发生这种情况是因为 SQL Server 在 case 语句中为每个 when 生成一个新的 newid()。您可以避免这样的问题:

DECLARE @rand TINYINT
SELECT  @rand = ABS(CHECKSUM(NEWID())) % 5 + 1

SELECT  CASE @rand
          WHEN 1 THEN 'excellent'
          WHEN 2 THEN 'good'
          WHEN 3 THEN 'fair'
          WHEN 4 THEN 'poor'
          WHEN 5 THEN 'failing'
        END

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    相关资源
    最近更新 更多