T-SQL: как бы вы фильтровали для «ab, ab ab», но не «ab, ab»? - PullRequest
1 голос
/ 17 января 2012

Извините, если этот вопрос не ясен.Короче говоря, у нас кто-то допустил несколько ошибок, которые привели к довольно неприятной проблеме повреждения данных.В результате мы получили кучу записей t-sql, которые выглядят следующим образом: «значение, значение, значение» и «это, это значение, это значение» с несколькими тысячами вариаций (иболее 110 тыс. записей).

Проблема в том, что нам нужно сопоставлять элементы, содержащие запятую, в любом месте строки, которая окружена любым символом (или его отсутствием), за исключением пробела, с помощью SQLГДЕ пункты.В качестве примера я создал следующую таблицу элементов, с битом, который указывает, вернее или нет, данный элемент должен быть возвращен запросом.

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);

Ближайшее, что я могу получить сегодня вечеромэто что-то вроде:

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

Однако он возвращает ложное совпадение с последним элементом.Есть идеи?

Ответы [ 2 ]

2 голосов
/ 17 января 2012

Попробуйте следующее:

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

ИЛИ почти то же самое:

SELECT *  
FROM @Ttests
WHERE 
    PatIndex('%[^ ],[^ ]%', toMatch) > 0
OR  PatIndex(',[^ ]%', toMatch) > 0
OR  PatIndex('%[^ ],', toMatch) > 0
2 голосов
/ 17 января 2012

Я думаю, вы просто неправильно переключили '%' и '[^]' в свои первые PatIndex:

SELECT
 *  
FROM @Ttests
WHERE PatIndex('%[^ ],[^ ]%', toMatch) > 0
   OR PatIndex(',%', toMatch) > 0
   OR PatIndex('%,', toMatch) > 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...