2010-03-09 3 views
3

J'ai une table qui a une colonne qui a le coût d'un produit, mais certaines (très peu) lignes ont du texte mélangé dans la colonne.La colonne contient un nombre, très peu de lignes ont du texte mélangé, puis-je créer une nouvelle colonne numérique?

Serait-il possible de créer une nouvelle colonne, de type décimal, et de la remplir avec l'autre colonne et d'ignorer les lignes contenant les données 'mauvaises'?

Je sais que je peux le faire via le code, mais j'espérais pouvoir le faire avec une requête sql comment?

Répondre

5

Vous pouvez utiliser un cas pour ne convertir que les colonnes entières. Cela retournerait NULL pour les colonnes non numériques:

select 
    case when isnumeric(col1) = 1 then cast(col1 as int) end 
from YourTable 

Ou vous pouvez simplement ignorer les colonnes non numériques:

select * 
from YourTable 
where isnumeric(col1) = 1 
+0

Je reçois: erreur de conversion type de données nvarchar à numérique. J'ai fait: quand isnumeric (pricetext) = 1 alors costPrice/cast (priceText comme décimal) – Blankman

+0

+1, ISNUMERIC() est le chemin à parcourir. @Blankman, c'est un code de travail valide, je l'ai testé sur mon système. Quel type de données est 'costprice'? montrez votre requête et listez les types de données de la colonne. mon cas de test: 'déclarez la table @YourTable (RowValue varchar (10), x int); INSERT INTO @YourTable VALEURS ('ZZZ', 2); INSERT INTO @YourTable VALUES ('123', 2); INSERT INTO @YourTable VALUES ('1A23', 2) INSERT INTO VALEURS @TABLE ('AAA', 2); sélectionnez cas lorsque isnumeric (RowValue) = 1 puis cast (RowValue en int)/x end de @ YourTable' –

+0

étrange, ça marche avec la clause WHERE! Merci. – Blankman

0

Comment ce son? Je l'utilise tout le temps. Simple & rapide.

NewColumn: iif(
       isnumeric([OldColumn]), 
       cdbl([OldColumn]) 
      ) 
+0

SQL Server ne prend pas en charge 'iif' – Andomar

+0

Ah, oui. Cela ne fonctionnerait que pour MS Access alors. – PowerUser

2

Oui ce que vous demandez est possible de faire.

Étape 1: Ajouter une nouvelle colonne

Ajouter une décimale (9, 2) colonne (PriceOfItem) à votre table (ItemPrices)

Étape 2: Exécutez cette requête (modification des noms d'objet selon les besoins)

Update ItemPrices 
Set PriceOfItem = Convert (Decimal (9, 2), PriceText) 
Where 1=1 
AND IsNumeric (PriceText) = 1 
+0

Je suis intéressé de savoir pourquoi vous avez "1 = 1" dans la clause WHERE? Cela équivaut à vrai et serait optimisé. – Tony

+0

@Tony: C'est purement pour faciliter le codage. Si j'ai plusieurs clauses 'AND' et que je dois les commenter ou les mettre en retrait, c'est vraiment facile. Essayez de commenter différentes parties d'un 'WHERE' avec 3 parties' AND', avec et sans '1 = 1' et vous verrez ce que je veux dire. –

+0

Merci pour l'explication. Je vois ce que vous voulez dire, cela facilite la suppression de certaines parties de l'article. – Tony

Questions connexes