2011-02-07 15 views
7

数値フィールドを持つDBがあり、すべての行を検索して非整数のみを返す必要があります。SQL数値以外のフィールドの数値フィールドを検索

私は、以下のクエリを試してみましたが、それはあなたが数(整数または浮動小数点数)のものとchar型のフィールドではないとだけように使用することができます0

SELECT 
li.QTY 
FROM 
    TABLE LI 
WHERE 
    li.QTY like '%.%' 
+0

申し訳ありませんが、私はちょうど '<>'あなたのコラムにしてこれらのプラクティスを適用します...私はここexapmle – djshortbus

+0

のうち、左側の関連する質問をされVARCHARにキャスト/ 44046 /切り捨て非小数点以下桁数 – Matthew

答えて

12

を持つレコードを再調整し続けます。

"整数" あなたは、これは行うことができます0.0、2.0、-5.0、などを意味していない12.5、0.67による場合:

SELECT li.QTY 
    FROM TABLE LI 
    WHERE li.QTY != ROUND(li.QTY , 0) 
; 

(SQL-Server用:ROUNDにTRUNCを編集しました) また、床やCEILING関数を使用することができます。

SELECT li.QTY 
    FROM TABLE LI 
    WHERE li.QTY != FLOOR(li.QTY) 
; 
+2

これは、**完全ではない**数値を必要とする点を除いて正しいです。単に '='を '<>'に切り替えてください。彼は 'ROUND'と' CAST AS INT'を使ってまったく同じロジックをすることができます...どちらが最速かを把握するだけです! – Matthew

+0

10進数の数字を探します – djshortbus

+0

はい、thnx。 ROUND関数とCEILING関数は同じように動作します。 INTとしてのCASTが高速で、おそらくそうではないかどうかはわかりません。 –

3

それはない作業を行いなぜ。 QTYが数値列である場合、その列を表示するか暗黙的にvarcharに変換すると(LIKEは暗黙的にそれを行います)、すべての数値が同じ小数点以下桁数にキャストされます。

は、このSQL文を考えてみましょう

with TBL(qty) as (select 1.1 union all select 3) 
SELECT li.QTY FROM TBL LI WHERE li.QTY like '%.%' 

出力

1.1 
3.0 << this contains "." even if it does not need to 

はBIGINTにキャストし、それが再びそれを比較、その後、任意の小数をドロップします。

SELECT li.QTY FROM TBL LI 
WHERE li.QTY <> CAST(qty as bigint) 


あなたはLIKEを使用する必要がある場合(またはちょうどショーのために...)私にとって

SELECT li.QTY, CONVERT(varchar, li.qty) 
FROM TBL LI 
WHERE li.QTY LIKE '%.%[^0]%' 
+0

+1なぜここで 'LIKE'はここでは動作しません – Matthew

+1

+1あなたは私を" bigintにキャスト "していた;) – onedaywhen

1
--Most Def...Cast as an int...Save you from validation of anything. Especially for conversions of dates into a whole date since Microsoft does not like a round down date function. 

--For example: 

--For every 300 hours an employee works they receive 1 whole day of vacation 

--partial days of vacation will not be counted 

Declare 

@SumHours as decimal(38,10), 

@VacationValidation as int 

Set @SumHours = 3121.30000000000000000000 
Set @VacationValidation = 300 

Select cast(((@SumHours)/(@VacationValidation)) as int) 
Select day(((@SumHours)/(@VacationValidation))) -1 

--without casting as an int, I would need to validated the Day function to make sure that I'm not 

--offsetting a whole day by one day. 
0

CAST関数作品。 http://stackoverflow.com/questions:

SELECT li.QTY FROM TABLE LI WHERE li.QTY != CAST(li.QTY AS INTEGER) 
関連する問題