2012-01-17 2 views
1

Désolé si cette question n'est pas claire. La petite histoire est que quelqu'un a fait des erreurs qui ont abouti à un problème de corruption de données. Le résultat final est que nous avons fini avec un tas d'entrées t-sql qui ressemblent à l'effet de: "valeur, valeur, valeur" et "ceci, est une valeur, c'est une valeur" avec quelques milliers de variations (et plus de 110k enregistrements impactés). Le problème est que nous devons faire correspondre les éléments qui contiennent une virgule, n'importe où dans la chaîne qui est entourée par un caractère (ou son absence) à l'exception d'un espace blanc, en utilisant les clauses SQL WHERE. A titre d'exemple, j'ai créé le tableau d'éléments suivant, avec un bit qui indique plutôt ou non l'item donné devrait être retourné par la requête.T-SQL: comment filtreriez-vous 'ab, ab ab' mais pas 'ab, ab'?

DECLARE @Ttests Table ( 
    toMatch varchar(4000), 
    shouldMatch bit 
) 
INSERT INTO @Ttests 
VALUES 
    ('value1,value2,value3,value1,value2,value3', 1), 
    ('value1, value2, value3', 0), 
    (',value1, value2, value3', 1), --starts with a comma 
    ('value1, value2,value2', 1), 
    ('this, is a sentence,this, is a sentence', 1), 
    ('value1, value2, value3,', 1), -- ends in a comma 
    ('value1 ,value2, value3', 0); 

Le plus proche que je semble être en mesure d'obtenir ce soir est quelque chose le long des lignes de:

SELECT 
* 
FROM @Ttests 
WHERE PatIndex('[^ ]%,[^ ]%', toMatch) > 0 
    OR PatIndex(',%', toMatch) > 0 
    OR PatIndex('%,', toMatch) > 0 

Cependant, il retourne un faux match sur le dernier élément. Des idées?

+0

Recherche de données dénormalisées, YUCK ... –

Répondre

2

Je pense que vous avez juste votre '%' et '[^]' commuté autour de la mauvaise façon dans votre première PatIndex:

SELECT 
* 
FROM @Ttests 
WHERE PatIndex('%[^ ],[^ ]%', toMatch) > 0 
    OR PatIndex(',%', toMatch) > 0 
    OR PatIndex('%,', toMatch) > 0 
+0

Merci, la partie triste est que j'ai eu cette variation là-bas auparavant, mais essayait de le résoudre sans les deux matchs PatIndex supplémentaires, donc avait fini par le changer autour. – PriorityMark

2

les opérations suivantes:

SELECT * 
FROM @Ttests 
WHERE 
(
    toMatch LIKE '%[^ ],[^ ]%' 
    OR toMatch LIKE ',[^ ]%' 
    OR toMatch LIKE '%[^ ],' 
) 

OU presque identique:

SELECT * 
FROM @Ttests 
WHERE 
    PatIndex('%[^ ],[^ ]%', toMatch) > 0 
OR PatIndex(',[^ ]%', toMatch) > 0 
OR PatIndex('%[^ ],', toMatch) > 0 
+0

Cela fonctionnerait aussi, merci. – PriorityMark

Questions connexes