2012-01-17 11 views
1

申し訳ありませんが、この質問が明確でない場合。簡単な話は、誰かに間違いを犯させて、データ破損の問題がかなり厄介なものになったということです。最終的には、「値、値、値」と「これは値です、これは値です」という数千のバリエーションを持つt-sqlエントリがいくつかあります。 110kを超えるレコードに影響を与えました)。T-SQL: 'ab、ab ab'はフィルタリングしますが、 'ab、ab'はフィルタリングしませんか?

問題は、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 

。何か案は?

私はあなたがちょうどあなたの '%' と '[^]' のあなたの最初の PatIndexに間違った方法を中心に切り替わったと思い
+0

非正規化データを検索すると、YUCK ... –

答えて

2

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

おかげさまで、悲しいことに、以前はそのバリエーションがありましたが、2つの余計なPatIndexのマッチなしでそれを解決しようとしていたので、それを変更してしまいました。 – PriorityMark

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

関連する問題