2011-02-07 6 views
7

Mam bazę danych, która ma pole liczbowe i muszę przeszukać wszystkie wiersze i zwrócić tylko liczby niecałkowite.Wyszukiwanie SQL w polu liczbowym dla liczb niepodzielonych

Próbowałem kwerendy poniżej i utrzymuje przestrajania rekordy, które mają 0.

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

Niestety, rzucam na VARCHAR i lewo z exapmle – djshortbus

+0

o to powiązane pytanie ... Wystarczy zastosować te praktyki z '<>' do kolumny: http://stackoverflow.com/questions/44046/truncate-not-round-decimal-places-in-sql-server – Matthew

Odpowiedz

12

można używać jak tylko pola char, a nie o numerze (liczby całkowitej lub float) z nich.

Jeśli przez „liczbami” znaczy 0,0, 2,0, -5,0, itd., A nie 12,5, 0,67, to może to zrobić:

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

(SQL-Server: redagował Trunc okrągłe) można także skorzystać z podłogi lub sufitu funkcje:

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

To poprawne, oprócz tego, że chce ** nie-całych ** liczb. Po prostu przełącz swoje '=' na '<>'. Mógłby zrobić dokładnie tę samą logikę używając 'ROUND' i' CAST AS INT' ... po prostu wymyślić, która jest najszybsza! – Matthew

+0

Szukasz dowolnej liczby dziesiętnej – djshortbus

+0

Tak, thnx. Funkcje ROUND i CEILING będą działać tak samo. Nie jestem pewien, czy CAST jak INT byłby szybszy, prawdopodobnie nie. –

3

Dlaczego to robi nie pracy. Kiedy QTY jest kolumną numeryczną, kiedy ją wyświetlasz lub niejawnie konwertujesz na varchar (LIKE robi to niejawnie), WSZYSTKIE numery będą rzutowane na tę samą liczbę miejsc dziesiętnych.

rozważyć tę instrukcję SQL

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

Output

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

wrzucił go do bigint i będzie spadać żadnych dziesiętnych, a następnie porównać je ponownie.

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


jeśli trzeba użyć podobnych (lub tylko na pokaz ..) pracę funkcji

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

+1 za wyjaśnienie mu, dlaczego "LIKE" nie działa tutaj – Matthew

+1

+1 Masz mnie w "Rzuć na biginta";) – 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

oddanych na mnie.

SELECT li.QTY FROM TABLE LI WHERE li.QTY != CAST(li.QTY AS INTEGER)