1

LOG()函数在以下查询中不起作用。我尝试将方程转换为浮点数。尽管如此,它仍然抛出错误:

发生了无效的浮点运算

有人可以帮我吗?

SELECT 
    t1.[ID], 
    SUM(1 / LOG(t1.[AttrCount] / t2.clustersize AS Float)) AS 'uu'
FROM 
    [Testing].[dbo].[entropytemp5] t1, [Testing].[dbo].[entropyclustersize] t2 
GROUP BY 
    t1.ID

Attrcount和的值Clustersize是:

AttrCount | Clustersize  
------------------------
    1            1  
    1            2  
    1            1  
    1            1   
    2            1  
    2            1  
    3            3

请让我知道,如果你有任何问题。

谢谢

4

2 回答 2

2

Invalid floating point operation是由于调用 LOG() 的值为零或更小而引起的。

您可能从下面指示的行中得到错误:

AttrCount | Clustersize  
------------------------
    1            1  
    1            2    <-- this one
    1            1  
    1            1   
    2            1  
    2            1  
    3            3

当我尝试时,LOG(1/2)我得到了Invalid floating point operation因为 SQL Server 将 1/2 视为 INT 并返回零,并且LOG(0)==> 无效的浮点运算。

如果你这样做,你仍然会得到错误:

1 / LOG(CAST(t1.[AttrCount] / t2.clustersize AS FLOAT))

这是因为 SQL Server 将计算 1/2,得到零,然后将其转换为浮点数。

相反,分别转换两个操作数。我试过这个并且它有效:

1 / LOG(CAST(t1.[AttrCount] AS FLOAT) / CAST(t2.clustersize AS FLOAT))

因此,您的整个查询将如下所示:

SELECT 
    t1.[ID], 
    SUM(1 / LOG(CAST(t1.[AttrCount] AS FLOAT) / CAST(t2.clustersize AS Float)) AS 'uu'
FROM 
    [Testing].[dbo].[entropytemp5] t1, [Testing].[dbo].[entropyclustersize] t2 
GROUP BY 
    t1.ID

...现在回到原来的帖子关于除以零的部分:)

如前所述,您也可以在查询的这一部分中除以零:

1 / LOG(t1.[AttrCount] / t2.clustersize)

这可以通过两种方式发生:

  1. 如果t2.ClusterSize为零
  2. 如果t1.AttrCount / t2.ClusterSize= 1(因为LOG(1)= 0)
于 2013-03-20T19:27:38.483 回答
1

首先,无论您现在看到的实际值如何,我都会进行“除以零”捕获。

其次,我会使用 ROW_NUMBER 技巧来确定它是导致问题的特定行还是整个查询。

这是一个通用示例,我输入“除以零”“捕捉”。我展示了 ROW_NUMBER 把戏。

如果第一次运行查询失败,请将值更改为 = 2。

Use Northwind
GO


Select derived1.*
From
    (
        select 
        [OrderID] , [ProductID] ,
        [MyRowId] = ROW_NUMBER() OVER(ORDER BY [OrderID] , [ProductID] )
        ,
        [Division1] = 
            case
                when LOG(Quantity) = 0 then 0.00
                when OrderID = 0 then 0.00
                else (UnitPrice / LOG(Quantity) / convert(float, OrderID) ) 
            end

        from 
        [dbo].[Order Details]
    )  as derived1

Where 
    derived1.[MyRowId] = 1 /* << Increment this by 1 until you find the problem row */

编辑

您需要显示所有值。

这将更快地暴露除零问题。

SELECT 
    t1.[ID], 

t1.[AttrCount] , 
LOG(t1.[AttrCount] ,
t2.clustersize AS Float , 

    SUM(1 / LOG(t1.[AttrCount] / t2.clustersize AS Float)) AS 'uu'
FROM 
    [Testing].[dbo].[entropytemp5] t1, [Testing].[dbo].[entropyclustersize] t2 
GROUP BY 
    t1.ID
于 2013-03-20T18:25:19.983 回答