2011-02-07 5 views
7

숫자 필드가있는 DB가 있고 모든 행을 검색하고 비 정수만 반환해야합니다.SQL 비 숫자의 숫자 필드 검색

나는 쿼리 아래 시도하고 당신이하지 번호 만 문자 필드와 마찬가지로 사용 (정수 또는 float) 할 수 있습니다 사람들을 0

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

미안 해요, 난 그냥 '<>'당신의 열의에 이러한 방법을 적용 ... 내가 여기 exapmle – djshortbus

+0

에서 제외 관련 질문은 VARCHAR 캐스팅/44046/truncate-not-round-decimal-places-in-sql-server – 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 편집) 또한 바닥이나 천장 기능을 사용할 수 있습니다 : 그것은 하지 작업을 수행하는 이유

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

** 전체 ** 이외의 ** 숫자를 제외하고이 정확한. '= '를'<>'로 바꾸면됩니다. 그는 'ROUND'와'CAST AS INT'를 사용하여 똑같은 논리를 할 수 있습니다 ... 어느 것이 가장 빠름을 알아 내십시오! – Matthew

+0

십진수가있는 숫자 찾기 – djshortbus

+0

예, thnx. ROUND와 CEILING 함수는 여기에서도 똑같이 작동합니다. CAST가 INT보다 빨라 졌는지, 아마도 그렇지 않은지 확실하지 않습니다. –

3

합니다. QTY가 숫자 열인 경우,이를 표시하거나 암시 적으로 varchar (암시 적으로 LIKE)로 변환하면 모든 숫자가 같은 소수 자릿수로 형 변환됩니다.

는 BIGINT이 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 

캐스트를 고려하고 그 다음에 다시 비교, 어떤 소수 떨어질 것이다.

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


당신이 좋아하는 (또는 쇼 ..) 나를 위해

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

+1 왜 그에게 'LIKE'가 여기에서 작동하지 않는지 설명해주세요. – Matthew

+1

+1 당신은 나를 "빅틴에게 던지십시오"; – 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)