では、私は、レコードのこのタイプがあります。SQL Serverクエリは、オペレータ
Rajkot,Gandhinagar
を私は上記のレコードは以下のレコードのように変更することにしたいです。
'Rajkot','Gandhinagar'
私は結果を得るためにIN演算子を使用したいと思います。
では、私は、レコードのこのタイプがあります。SQL Serverクエリは、オペレータ
Rajkot,Gandhinagar
を私は上記のレコードは以下のレコードのように変更することにしたいです。
'Rajkot','Gandhinagar'
私は結果を得るためにIN演算子を使用したいと思います。
通常、ジャンクションテーブルを使用するとコメントに記載されているように、より良い結果が得られることに注意してください。それでも
、あなたがデザインで立ち往生していると仮定すると:あなたの場合は
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は、デザインについて独断的ではないはずですが、テスト。
コード:
select ''''+substring('Rajkot,Gandhinagar',1,charindex(',','Rajkot,Gandhinagar',0)-1)+'''' + ',' +''''+
substring('Rajkot,Gandhinagar',charindex(',','Rajkot,Gandhinagar',0)+1,len('Rajkot,Gandhinagar'))+''''
あなたが列に複数の値を保存しないでください。代わりに接合テーブルを使用してください。 –
'SELECT '' '' + REPLACE( 'Rajkot、Gandhinagar'、 '、' ''、 '' ')+' '' '' – gofr1
@ gofr1 – sagi