2016-09-15 4 views
1

では、私は、レコードのこのタイプがあります。SQL Serverクエリは、オペレータ

Rajkot,Gandhinagar 

を私は上記のレコードは以下のレコードのように変更することにしたいです。

'Rajkot','Gandhinagar' 

私は結果を得るためにIN演算子を使用したいと思います。

+3

あなたが列に複数の値を保存しないでください。代わりに接合テーブルを使用してください。 –

+0

'SELECT '' '' + REPLACE( 'Rajkot、Gandhinagar'、 '、' ''、 '' ')+' '' '' – gofr1

+0

@ gofr1 – sagi

答えて

2

通常、ジャンクションテーブルを使用するとコメントに記載されているように、より良い結果が得られることに注意してください。それでも

、あなたがデザインで立ち往生していると仮定すると:あなたの場合は

Select * 
from TableA a 
where ','+ValueList+',' like '%,'[email protected]+',%' 

:これを試してみてください

Select * 
from TableA a 
where @Value in ValueList -- ERROR 

TableA 
ID  ValueList 
1  Uno,Dos,Tres 
2  Foo,Bar,Baz,Quux 

そして、あなたはこの同等のものをやりたいですこれをやりたい:

select * 
from TableA b 
where b.Value in (select ValueList from TableA a where a.ID = b.ID) 

てみてください:デザインと性能上

select * 
from TableB b 
where exists (
    select 1 from TableA a 
    where a.ID = b.ID and ','+a.ValueList+',' like '%,'+b.Value+',%' 
) 

注:このデザインは、列ValueListで使用されているすべてのインデックスを防ぐことができます。これがあれば問題ではないかもしれない。

  • テーブルAは非常に小さく、非常に少数の行(例えば< 10行)を有しています。これは、データが1ページまたは2ページに収まる場合、索引を検索するオーバーヘッドが、ページをスキャンして文字列比較を行うだけのオーバーヘッドよりも大きくなる可能性があるからです。

  • 実際には、非常に小さな行のサブセットのみが検索されます。

  • たとえば、一意のキーまたは効率的なインデックスで数十の行を検索し、文字列がValueListにあるかどうかに基づいてフィルタリングする場合、これはデータが同じページに保持されているため、接合テーブル。

  • (テストに失敗した行をクライアントに返す必要がないため、クライアント側をフィルタするよりも高速かもしれません)。
つまり

、あなたはこのリストの値によってを探していない場合は、それらによってをフィルタリング単に、それはジャンクションテーブルにそれらを置く価値がないかもしれません。

いつものように1は、デザインについて独断的ではないはずですが、テスト

0

コード:

select ''''+substring('Rajkot,Gandhinagar',1,charindex(',','Rajkot,Gandhinagar',0)-1)+'''' + ',' +''''+ 
     substring('Rajkot,Gandhinagar',charindex(',','Rajkot,Gandhinagar',0)+1,len('Rajkot,Gandhinagar'))+''''