2010-09-13 5 views
2

Salutations, Je dois vérifier si le format de base de données de valeur stockée est correcte. Il devrait vérifier quelque chose comme ça:Comment vérifier si le format est correct

x-x 
x-xx 
xx-xx 
xxx-xxx 
etc. 

où xxx devrait être un nombre entier. Donc, le concept est de vérifier si la valeur a le format suivant: Entier - Entier

Répondre

0

Essayez ceci -

select CASE WHEN (
charindex('-',columnName) > 0 
AND 
ISNUMERIC(left(columnName,(charindex('-',columnName)-1))) > 0 
AND 
ISNUMERIC(right(columnName,(charindex('-',columnName)))) > 0 
) THEN 1 ELSE 0 END as properWord 
from myTable 

renvoie 1 si bon mot sinon retourne 0

EDIT: Travaux en supposant que vous n'avez pas des chaînes avec consécutive « - » comme « - » suivi par des chiffres sur les deux côtés. Fonctionne pour tous les autres cas.

+1

Malheureusement, -1 est alo numérique, donc cela correspond '1--1' – Andomar

+0

@Andormar - Aah .. Got it !!. –

4

SQL n'a pas la correspondance de motif le plus puissant. Mais cette requête devrait trouver les formats les plus mauvais:

select * 
from YourTable 
where col1 like '%[^0-9-]%' 
     or col1 like '%-%-%' 
     or col1 not like '%[0-9]-[0-9]%' 

Cela fonctionne comme:

  • col1 like '%[^0-9-]%' il ne peut y avoir des chiffres et des tirets
  • col1 like '%-%-%' il ne peut y avoir deux tirets
  • col1 not like '%[0-9]-[0-9]%' il faut un un chiffre à gauche et à droite du tableau de bord
+0

Intéressant que vous avez écrit une requête pour trouver des données erronées, mais je l'ai écrit un pour trouver de bonnes données. L'utilisation par l'OP du travail 'check' m'a fait penser à une contrainte CHECK, je suppose. – Pondlife

0
create table #t (
    txt varchar(100) 
) 
go 

insert into #t select '1-1' 
insert into #t select '11-22' 
insert into #t select '1-1-' 
insert into #t select '1-A' 
insert into #t select '1-A1' 
insert into #t select '-' 
insert into #t select '1-1-1' 
insert into #t select '1 - 3' 
go 

select 
    txt 
from 
    #t 
where 
    -- digits and dashes only 
    txt not like '%[^0-9-]%' and 
    -- one dash only 
    len(replace(txt, '-', '')) = len(txt)-1 and 
    -- starts and ends with a digit 
    txt like '[0-9]%[0-9]' 

Cela devrait le faire, en supposant que vous n'avez pas d'autres exigences pour espaces de manutention ou autre, et vous pouvez le faire dans une contrainte CHECK si vous voulez.

Questions connexes