1

SQL の LIKE 一致に基づいてデータの行を削除しようとすると問題が発生します。SQL Server 2005 を使用しています。

以下のような情報を保持するテーブル(@Containers)があります:-

PMBID   DEPT
------  ---------
248057  5,8
249799  5,6,8
249800  5
249941  1,5
249942  1,4,15,16
249943  1,4,5
249945  4
249946  4
249947  4
249966  8,16,23
249967  5,6,8,16

両方の列は文字列です。部門に基づいて行を削除できるクエリが必要です。たとえば、PMBID に部門 1、11、23、または 31 が含まれている場合は、テーブルから削除する必要があります。したがって、このロジック PMBID では...

249941
249942
249943
249966

削除されます。

では、列が文字列であると見なされる SQL でこれを (うまく) 行うにはどうすればよいでしょうか?

などのクエリを書いてきました...

DELETE FROM @Containers WHERE (Dept LIKE '%1%' OR Dept LIKE '%11%' OR Dept LIKE '%23%' OR Dept LIKE '%31%')

明らかに、このステートメントは 15 や 16 などの部門をキャッチするため機能しません。たとえば、PMBID

249967

明示的に 1、11、23、または 31 (またはこれらの組み合わせ) ではないため、含まれるべきではない場合に含まれます。

これは文字列列で可能ですか? デリミタを使用して、クエリを改善することはできますか?

クエリを過度に複雑にするリスクがあるため、ここで停止します。さらに情報が必要な場合はお知らせください。

4

3 に答える 3

4

リスト内のカンマ検索の問題。DEPT文字列内の値をカンマで囲みます。

DELETE FROM @Containers
    WHERE (','+Dept+',' LIKE '%,1,%' OR
           ','+Dept+','  LIKE '%,11,%' OR
           ','+Dept+','  LIKE '%,23,%' OR
           ','+Dept+','  LIKE '%,31,%')
于 2013-06-05T13:51:25.470 に答える
1

コンマ区切りの文字列でデータを保存するのは悪い習慣ですが、これは例として部門 1 で機能します。

DELETE FROM @Containers 
WHERE Dept  LIKE '%,1'
   OR Dept   LIKE '1,%'
   OR Dept   LIKE '%,1,%'

11 などのキャッチから 1 を除外するには、条件にコンマを強制する必要があります。

于 2013-06-05T13:50:29.267 に答える
0

文字列を個々の値に分割する関数を使用する方がきれいかもしれません。このテーマに関する良い記事:
http://www.sqlperformance.com/2012/07/t-sql-queries/split-strings

于 2013-06-05T15:07:45.307 に答える