很抱歉,如果这个问题不明确。简短的故事是,我们有人犯了一些错误,导致了一个非常讨厌的数据损坏问题。最终的结果是我们最终得到了一堆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
但是,它会在最后一项上返回错误匹配。有什么想法吗?
答案 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