0

6 桁の文字列 (社会保障番号の一部を表す) のリストが与えられた場合、SSN がそれらの文字列の 1 つと一致するユーザーのデータセットを取得する必要があります。私のSQLは:

SELECT DISTINCT
         u.ssn,
         u.name
FROM user u
WHERE (u.ssn LIKE '%111111%' OR u.ssn LIKE '%222222%')

インライン SQL (インジェクション攻撃など) を生成する代わりに、プリペアド ステートメントを使用したいのですが、インライン SQL を作成せずにデータを取り戻す方法はありますか?

このサイトにも同様の質問がありますが、私の場合の問題は、LIKE の代わりに IN 句を使用するオプションがないことです。私は 6 桁しか与えられておらず、10 桁の SSN 全体を検索する必要があります。

ps これは、SQL Server バックエンドを持つ .Net アプリケーションです。

4

1 に答える 1

2

検索語を表に入れて結合します。

declare @SSN table (SSN char(9))
insert into @SSN select '123456789' union select '456789321' union select '789123456'

declare @SearchString table (SearchString varchar(9))
insert into @SearchString select '893' union select '9123'

select ssn.SSN
from @SSN ssn
join @SearchString sst on ssn.SSN like '%' + sst.SearchString +'%'

パフォーマンスが問題で、検索文字列が常に 5 文字以上の長さである場合 (たとえば)、各 SSN と考えられるすべての 5 文字の部分文字列を含むテーブルを作成できます。次に、部分的な値ではなく、一致する値で列を結合できます。ただし、これは要件によって異なります。

于 2012-11-28T23:14:41.910 に答える