2009-04-07 5 views
2

J'ai une colonne nvarchar BigMacs dans la table McTable dans ma base de données MS SQL 2005 avec des valeurs alfanumeric et numériques. Par exemple:Sélectionnez et filtrez nvarchar comme un int

  • 432adfad
  • sfs54543

Et maintenant je voudrais faire quelque chose comme ceci:

select Convert(BigMacs, int) from McTable 
where IsNumerc(BigMacs) = 1 AND Convert(BigMacs, int) > 6 

Mais quand je fais J'ai une erreur:

Msg 245, Level 16, State 1, Line 41 Conversion failed when converting the nvarchar value '.' to data type int.

Sélectionner en ligne.

Comment résoudre ce problème?

Répondre

2

Ceci est probablement parce que la fonction IsNumeric renvoie true pour toute valeur qui pourrait être convertie en nombre. Essayez l'exemple suivant:

create table McTable (BigMac varchar(255)) 

insert into McTable select '1p927' 
insert into McTable select '1927' 
insert into McTable select '1,927' 
insert into McTable select '1.927' 

select BigMac, isnumeric(BigMac) 
from McTable 

select BigMac, CAST(BigMac AS DECIMAL) 
from McTable 
where isnumeric(BigMac) = 1 

Même si toutes les lignes sauf le '1p927' sont numériques, la conversion échouera! Ceci est dû au fait que '1 927' ne peut pas être converti en un nombre décimal (sur ma machine)

IsNumeric ne fonctionne pas exactement comme spécifié. Comme l'a constaté here, vous pouvez utiliser

IsNumeric (data + 'e0') 

-Edo

+0

Ok, mais quand je sélectionne encore select je reçois cette erreur (comme Spencer Ruport) –

+0

Je n'ai pas de coma ou de point dans mes valeurs. –

+0

Mon point est que IsNumeric() renvoie 1 pour les valeurs qui ne peuvent pas être converties en nombre décimal. Vous ne pouvez pas compter dessus. – edosoft

2

Essayez ceci:

SELECT * 
FROM (
     SELECT REPLACE(BigMacs, ',', '.') AS BigMacs 
     FROM McTable m 
     WHERE IsNumerc(BigMacs) = 1 
     ) q 
WHERE CAST(BigMacs AS DECIMAL) > 6 

IsNumeric retournera TRUE sur les fractions décimales comme 1234.1232, mais ils ne peuvent pas être convertis en INT.

Checking:

WITH McTable AS 
     (
     SELECT '123124,123123' AS BigMacs 
     ) 
SELECT * 
FROM (
     SELECT REPLACE(BigMacs, ',', '.') AS BigMacs 
     FROM McTable 
     WHERE IsNumeric(BigMacs) = 1 
     ) q 
WHERE CAST(BigMacs AS DECIMAL) > 6 

----------- 
123124.123123 
+0

Cela ne fonctionne pas (condition dans select?). Et quand je le déplace vers où j'obtiens l'erreur: Erreur en convertissant le type de données nvarchar en numérique., Mais quand je choisis IsNumeric (BigMacs) je reçois tous 1. –

+0

Que essayez-vous exactement de SELECTIONNER? Que signifie cette condition «> 6»? Essayez-vous de sélectionner toutes les lignes applicables et de savoir si elles sont plus grandes que 6, ou de filtrer ces lignes moins de 6? – Quassnoi

+0

Je voudrais obtenir des lignes de McTable qui ont une valeur numérique dans BigMacs et que cette valeur est supérieure à 6 –

2

Il y a plusieurs façons d'y parvenir. Les deux fonctionnent de la même manière. Il est préférable de ne pas utiliser de remplacement dans cette situation car il y a trop d'inconnues à prendre en compte pour remplacer. Il est préférable de filtrer tout ce qui n'est pas ce que votre après.

SELECT 
    CONVERT(INT,BigMacs) AS BigMacs 
FROM 
    McTable 
WHERE 
    ISNUMERIC(BigMacs) = 1 
AND PATINDEX('%[^0-9]%', BigMacs) = 0 


SELECT 
    CONVERT(INT,BigMacs) AS BigMacs 
FROM 
    McTable 
WHERE 
    ISNUMERIC(BigMacs) = 1 
AND BigMacs NOT LIKE ('%[^0-9]%') 

Remarque: Il est utile que les utilisateurs orthographient correctement ISNUMERIC(). Cela aide aussi si vous utilisez l'ordre de syntaxe correct sur CONVERT()

Questions connexes