0

特定の行に対して次のような文字列を含むデータベース列がありますu/1u/3u/19/g1/g4

その列に次の要素の少なくとも 1 つを持つすべての行を取得する効率的な方法はあり['u/3', 'g4']ますか?

句を使用できることはわかっていますANDが、検証する要素の数はさまざまであり、大きくなる可能性があります..

プロジェクトで RoR/ActiveRecord を使用しています。

4

1 に答える 1

0

SQL Serverでは、XMLを使用して検索パラメーターのリストをレコードセットに変換し、それをベーステーブルと相互結合し、charIndex()を実行して列にサブ文字列が含まれているかどうかを確認できます。

テーブルまたは列の名前がわからないため、「phone_home」列を持つ、すでにデータが含まれているテーブル(persons)を使用しました。「202」または「785」を含む電話番号を検索するには、次のクエリを使用します。

select  person_id,phone_home,Split.data.value('.', 'VARCHAR(10)')
from    (select *, cast('<n>202</n><n>785</n>' as XML) as myXML
        from persons) as data cross apply myXML.nodes('/n') as Split(data)
where charindex(Split.data.value('.', 'VARCHAR(10)'),data.phone_Home) > 0

複数の値に一致する場合は重複レコードが発生するため、そこに個別のレコードをスローし、それが望ましくない場合はselectステートメントからSplitを削除します。

SQLでxmlを使用することは、私にとってはブードゥーの魔法です...私はこの投稿からアイデアを得ましたhttp://www.sqljason.com/2010/05/converting-single-comma-separated-row.html

パフォーマンスがどのようなものかわかりません...しかし、少なくともカーソルや動的SQLはありません。

編集:XMLのキャストはかなり遅いので、変数にしたので、一度だけキャストされます。

declare @xml XML
set @xml = cast('<n>202</n><n>785</n>' as XML)

select  person_id,phone_home,Split.persons.value('.', 'VARCHAR(10)')
from    persons cross apply @xml.nodes('/n') as Split(persons)
where charindex(Split.persons.value('.', 'VARCHAR(10)'),phone_Home) > 0
于 2013-03-01T20:55:29.367 に答える