2

いずれにせよ、次の形式でクエリがあります

select 
(select count(*) from sometable where somecritiea) / ((select count(*) from sometable where somecritiea) + 0.000001) 
from sometable

カウントの結果をカウントの結果で割るので、null は問題になりません。

これを実行すると、「ゼロ除算エラーが発生しました。」が表示されます。除数の +0.000001 に注目してください。

列挙子 (?) と除数を新しいテーブルに挿入してから同じ計算を実行すると、期待どおりに機能します。

select 
(select count(*) from sometable where somecritiea) a/ ((select count(*) from sometable where somecritiea) + 0.000001) b
into testtable
from sometable

テストテーブルから a/b を選択

これにより、期待される結果がエラーなしで返されます。

私が走れば

select * from testtable where b = 0
i get 0 records as expected.

私は本当にここでそれを失っています.これは5時間の混乱に変わった5分の仕事です.

私も試してみました

select *
((select count(*) from sometable where somecritiea) + 0.000001) divisor
from sometable
where divisor = 0

これはレコードを返しません。

4

3 に答える 3

3

正直なところ、私もあなたの問題を再現できませんでしたが、これは問題なく機能するはずです。

WITH Divisor AS (select count(*)*1.0 BotCnt from sys.procedures),
    Dividend AS (select count(*)*1.0 TopCnt from sys.tables )
SELECT 
    CASE WHEN BotCnt = 0 THEN 0 ELSE TopCnt/BotCnt END,
    *
FROM sys.objects
CROSS JOIN Divisor
CROSS JOIN Dividend

に注意してください*1.0。つまり、カウントを 10 進数に変換します。明示的な変換を同じように簡単に使用できます。2 つの CTE が単一行であるため、CROSS JOIN のみが機能します。それ以外の場合は、ON 句を指定して INNER JOIN を使用します。

于 2013-03-23T01:32:38.040 に答える
1

これは、あなたのシナリオをすばやく再現するのに最も近い方法であり、問​​題なく動作します。0.0000000 を返します。

with sometable as (
  select * from ( values 
    (0)
  ) sometable(value)
)
select 
  (select count(*) from sometable where value <> 0 )
/ 
( (select count(*) from sometable where value <> 0 ) + 0.000001 ) 
from sometable
于 2013-03-23T01:35:15.750 に答える
0

NULLIF除数を試してみてください

select 
(select count(*) from sometable where somecritiea) / NULLIF((select count(*) from sometable     where somecritiea) + 0.000001), 0) from sometable

これはNULL、分母が 0 の場合は常に 0 で除算する代わりに返されます。NULL他のデフォルトの回答 (9 など) が必要ない場合はISNULL、クエリ全体で使用して 0 に戻します。

于 2013-03-23T09:34:13.417 に答える