2012-01-17 83 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