2011-02-07 14 views
7

Tengo un DB que tiene un campo numérico y necesito buscar todas las filas y devolver solo los números no enteros.Búsqueda SQL en un campo numérico para números no enteros

He tratado por debajo de la consulta y se mantiene resintonizar los registros que tienen 0.

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

Lo sentimos, echo a varchar me dejó fuera de la exapmle – djshortbus

+0

Aquí es una pregunta relacionada ... Basta con aplicar estas prácticas con el '<>' para su columna: http://stackoverflow.com/questions/44046/truncate-not-round-decimal-places-in-sql-server – Matthew

Respuesta

12

Puede utilizar COMO únicamente con campos char, no con el número (entero o flotar) queridos.

Si por "números enteros" que significan 0.0, 2.0, -5.0, etc. y no 12,5, 0,67, entonces esto puede hacer:

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

(para SQL Server: editado el TRUNCAR en redondo) también puede utilizar las funciones de suelo o techo:

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

Esto es correcto, excepto que quiere ** números enteros **. Simplemente cambie su '=' a '<>'. Él podría hacer exactamente la misma lógica usando 'ROUND' y' CAST AS INT' ... ¡solo averigüe cuál es el más rápido! – Matthew

+0

Buscando cualquier número con un decimal – djshortbus

+0

Sí, thnx. Las funciones REDONDEADAS y TECHO funcionarían igual aquí. No estoy seguro si CAST como INT sería más rápido, probablemente no. –

3

¿Por qué no lo hace trabajo. Cuando QTY es una columna numérica, cuando la visualiza o se convierte implícitamente a varchar (LIKE lo hace implícitamente), TODOS los números se convertirán al mismo número de decimales.

considerar esta sentencia SQL

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

salida

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

moldeada a un bigint y se eliminarán cualquier decimales, luego se compara de nuevo.

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


Si tiene que usar LIKE (o sólo para mostrar ..)

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

+1 para explicarle por qué 'LIKE' no funciona aquí – Matthew

+1

+1 Me tienes a" Cast it a 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

REPARTO función de trabajo para mí.

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