2011-02-07 14 views
7

Ho un DB che ha un campo numerico e devo cercare tutte le righe e restituire solo i numeri non interi.Ricerca SQL in un campo numerico per numeri interi non interi

Ho provato la domanda sotto e mantiene risintonizzare record che hanno 0.

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

Siamo spiacenti, ho lanciato a VARCHAR ho lasciato fuori dalla exapmle – djshortbus

+0

Qui è una questione connessa ... Basta applicare queste pratiche con la '<>' per la colonna: http://stackoverflow.com/questions/44046/truncate-not-round-decimal-places-in-sql-server – Matthew

risposta

12

È possibile utilizzare come solo con campi char, non con il numero (intero o float) quelli.

Se per "numeri interi" intendi 0.0, 2.0, -5.0, ecc e non 12.5, 0.67 allora questo può fare:

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

(per SQL-Server: a cura della TRUNC in ROUND) è anche possibile utilizzare le funzioni di pavimento o soffitto:

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

Questo corretto eccetto che vuole ** numeri non interi **. Passa semplicemente da '=' a '<>'. Poteva fare la stessa logica usando 'ROUND' e' CAST AS INT' ... solo per capire qual è il più veloce! – Matthew

+0

Ricerca di qualsiasi numero con un decimale – djshortbus

+0

Sì, thnx. Le funzioni ROUND e CEILING funzionerebbero allo stesso modo qui. Non sono sicuro se CAST come INT sarebbe più veloce, probabilmente no. –

3

Perché lo fa non lavoro. Quando QTY è una colonna numerica, quando la si visualizza o la si converte implicitamente in varchar (LIKE lo fa implicitamente), TUTTI i numeri verranno espressi allo stesso numero di cifre decimali.

considerare questa istruzione SQL

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

uscita

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

Fusioni in un bigint e lascerà cadere i decimali, quindi confrontare di nuovo.

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


Se è necessario utilizzare LIKE (o solo per l'esposizione ..)

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

+1 per spiegargli perché 'LIKE' non funziona qui – Matthew

+1

+1 Mi hai preso a" Trasmettilo a un 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 lavoro di funzione per me.

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