2009-07-18 10 views
6

que necesito una consulta ayuda ncomparaciones numéricas en datos de la columna de cuerda

"totalexp" es un campo nvarchar ... en una tabla y necesito para seleccionar, como a continuación

select EmpId,FirstName,totalexp from sample where totalexp > '6' 

empid firstname  totalexp 
1  Me    8.2 
5  as    6 
10  567    64 mon 
11  leader   6+ yrs 
12  admintest  6.3 
16  G    6 

Tengo valores como 11, 12, 21 y todo eso no muestra esas cosas

+0

convertir el columna a int primero. Es más apropiado de esa manera. –

+0

¿Te dolería incluir una descripción en la pregunta? –

+0

Supongo que tiene "mon", "yrs", "+", etc. en la columna totalexp? Al filtrar, ¿quiere "6.3" y "64 mon" en la salida, o solo datos enteros/numéricos verdaderos? – gbn

Respuesta

2

Quizás 'totalexp' necesite ser un campo numérico (int etc.) en lugar de nvarchar para la comparación en la cláusula where para trabajar. Usar nvarchar para almacenar números no es una buena idea.

+0

Sí, tiene razón, pero esta es una tabla anterior que se usa en los negocios, pero ahora tengo que filtrar en función de esa condición. ¿Hay alguna forma de –

7

Si no puede cambiar el tipo de columna, debe usar CAST or CONVERT antes de hacer la comparación. El código sería:

SELECT EmpId, FirstName, TotalExp 
FROM sample 
WHERE CAST(TotalExp AS INT) > 6 

Un poco de advertencia: con su estructura de base de datos actual, cualquier persona puede insertar TotalExp como 'uno' o 'dos' o cualquier otra cadena arbitraria, y la consulta se producirá un error. No es realmente algo que quieras que pase, en serio.

3

Mi principal recomendación para usted sería realizar un ejercicio de limpieza de datos para estandarizar los datos de la columna. En la actualidad hay múltiples formas/estándares de datos dentro de una sola columna.


En caso de que deseen hacer caso omiso de los datos de carácter completamente sin embargo, a continuación, con el fin de dar cuenta de los valores de columna que no va a convertir de forma natural a un entero que podría hacer uso de la función IsNumeric() para comprobar los datos de columna como numérico.

Véase el siguiente ejemplo para más detalles:

create table #testTable 
(
    NumericAsString nvarchar(100) 
); 

insert into #testTable (NumericAsString) values('1'); 
insert into #testTable (NumericAsString) values('4'); 
insert into #testTable (NumericAsString) values('28'); 
insert into #testTable (NumericAsString) values('32'); 
insert into #testTable (NumericAsString) values('11232'); 
insert into #testTable (NumericAsString) values('fdsfdfas'); 
insert into #testTable (NumericAsString) values('wtwtrwtw'); 

select * 
from #testTable; 

select NumericAsString 
from #testTable 
where 
    (
    case 
     when isnumeric(NumericAsString) = 1 then convert(int, NumericAsString) 
     else 0 
    end) 
    > 6 

drop table #testTable; 
+0

... Fallará para los datos no numéricos – gbn

+0

@gbn: Absolutamente, pero yo hubiera pensado que era evidente. Para una mayor claridad, sin embargo, he modificado la publicación original para ahora probar los datos numéricos –

+0

. Nunca asumiría que la gente lo entenderá ... Sin embargo, creo que el requisito es vago. ¿Para qué OP quiere filtrar realmente? – gbn

2

Trate de usar Cast or Convert en usted cláusula where para cambiar el tipo de totalexp a un entero.

SELECT EmpId,FirstName,totalexp 
FROM sample 
WHERE CONVERT(int ,totalexp) > 6 
+1

... Fallará para datos no numéricos – gbn

5

El lío empieza con TotalExp siendo nvarchar, ya que contiene los datos que pueden ser "6 meses", "6 años", "6 + años", etc. ¿Cuál es la intención detrás de

where totalexp > '6' 

? 6 años, 6 meses, 65 días?

Necesita convertir los datos en un formato numérico, por ejemplo, un número de meses que puede comparar con algún requisito (como 'meses de experiencia').

Sin embargo, en un año sus datos quedarán obsoletos ya que no cambia, ya que excepto que cada TotalExp que ahora dice "6 años" debería ser "7 años" (si esa habilidad se ha practicado en el mientras tanto).

Por lo tanto, para las habilidades activas sería preferible tener un campo ExperienceSince DATETIME, que tiene el agradable efecto de que su "experiencia total" resultante siempre está actualizada.

2

Sé que la pregunta es muy antigua. Acaba de publicar la respuesta porque podría ser útil para alguien.

El siguiente código se puede usar en escenarios donde existen valores no numéricos para otras filas.

SELECT EmpId,FirstName,totalexp 
FROM sample 
WHERE 
(CASE 
WHEN (ISNUMERIC(totalexp) = 1) 
THEN CAST(LTRIM(RTRIM(totalexp)) AS float) 
ELSE 0 END) > 6 

El código se prueba de trabajo

+0

Gracias por editar la respuesta jHilscher – Shammas

+1

Podría estar equivocado pero siento que "ELSE 0" (última línea) podría causar resultados incorrectos al comparar con cero. Tal vez deberías usar "ELSE NULL" en su lugar. –

Cuestiones relacionadas