2012-01-17 4 views
1

이 질문이 분명하지 않은 경우 죄송합니다. 단편적인 이야기는 누군가 실수로 데이터 오염 문제가 발생했다는 것입니다. 결과적으로 'value, value, value'와 'this는 값이고 this는 값입니다'라는 효과를 보이는 t-sql 항목이 몇 가지 있습니다. 영향을받은 110,000 건 이상의 레코드).T-SQL : 'ab, ab ab'대신 'ab, ab'를 필터링하는 방법은 무엇입니까?

문제는 SQL WHERE 절을 사용하여 공백 이외의 문자 (또는 공백이없는 문자)로 둘러싸인 문자열의 쉼표가있는 항목을 일치시켜야한다는 것입니다. 예를 들어, 다음 항목 표를 만든다. 주어진 항목이 쿼리에 의해 반환되어야하는지 아닌지를 나타내는 비트가있다.

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

그러나, 그것은 마지막 항목에 잘못된 일치를 반환

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

오늘 밤을 얻을 수있을 것 가장 가까운의 라인을 따라 무언가이다. 어떤 아이디어?

+0

비정규 화 된 데이터 검색, YUCK ... –

답변

2

나는 당신이 당신의 '%'와 있다고 생각 '[^]'첫 PatIndex 당신에 잘못된 방향으로 주위에 전환 :

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 
+0

고마워 슬픈 부분은 이전에 그 변형이 있었지만 두 번의 추가 PatIndex 일치가 없으면이를 해결하려고 했으므로 결국 변경하게되었습니다. – PriorityMark

2

다음 시도 거의 동일 :

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

이것도 작동합니다, 고마워. – PriorityMark

관련 문제