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?
Recherche de données dénormalisées, YUCK ... –