2012-01-17 79 views
1

對不起,如果這個問題不清楚。簡短的故事是,我們有人犯了一些錯誤,導致了一個非常討厭的數據損壞問題。最終的結果是,我們結束了一堆t-sql條目,它們看起來有如下效果:'value,value,value'和'this,是一個值,這是一個值',具有幾千個變體超過11萬條記錄受到影響)。T-SQL:如何過濾'ab,ab ab'但不是'ab,ab'?

問題是,我們需要通過使用SQL WHERE子句來匹配包含逗號的項目,這些項目由包含任何字符(或缺少)的字符串包圍的字符串中的任何位置使用SQL WHERE子句。作爲一個例子,我創建了一些下面的項目表,其中有一點指出了是否應該由查詢返回給定的項目。

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 

但是,它返回的最後一項錯誤匹配。有任何想法嗎?

+0

正在搜索非規格化數據YUCK ... – 2012-01-17 05:32:15

回答

2

我認爲你有你的 '%' 和 '[^]' 在你第一次PatIndex周圍的錯誤的方式切換:

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

謝謝,可悲的是我之前在那裏有過那種變化,但是試圖在沒有兩個額外的PatIndex匹配的情況下解決它,所以最終改變了它。 – PriorityMark 2012-01-17 05:41:29

2

嘗試以下操作:

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

OR幾乎相同:

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

這也可以,謝謝。 – PriorityMark 2012-01-17 05:43:14