T-SQL:你如何过滤'ab,ab ab'而不是'ab,ab'?

时间:2012-01-17 05:26:48

标签: sql tsql

很抱歉,如果这个问题不明确。简短的故事是,我们有人犯了一些错误,导致了一个非常讨厌的数据损坏问题。最终的结果是我们最终得到了一堆t-sql条目,这些条目看起来效果如下:'value,value,value'和'this,是一个值,这是一个值',有几千种变化(和受影响超过110k的记录。)

问题是我们需要通过使用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

但是,它会在最后一项上返回错误匹配。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

我认为你的第一个PatIndex中的'%'和'[^]'错误地转换了:

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

答案 1 :(得分: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