0

多くの異なるフォーム フィールドに基づいてデータベースを検索するクエリを作成しようとしています。入力されたフィールドでクエリをフィルター処理し、フォームに入力されていないフィールドを単に無視するようにします。例えば:

フォーム フィールド: -プロジェクト名 -プロジェクト番号 -プロジェクト マネージャー

そのため、ユーザーがプロジェクト名に「Joe」を入力すると、そのレコードの他の値に関係なく、名前フィールドに任意の形式の「joe」を含むすべての結果が返されます。

私は厳密に SQL でこれを達成しようとしてきましたが、間違った (まだ期待されている) 結果が得られています。私はかなり多額のクエリをいくつか持っています。

この最初のクエリは、すべての条件に対して AND ステートメントを使用して設定されました。データベース内の NULL 値はまだワイルドカードによって取得されないため、機能しないことに気付きました。

    <ListDataSource CommandText="
SELECT [surveyid], 
       [projectnumber], 
       [siteno], 
       [person], 
       [subatpdate], 
       [projectname], 
       [priorsurveyor], 
       [siteaddress], 
       [sitecity], 
       [sitestate], 
       [sitezip], 
       [survey], 
       [zoning], 
       [environmental], 
       [emg_projectnumber], 
       [zoning_projectnumber], 
       [surveyor_projectnumber] 
FROM   tblrawprojectdatabase 
WHERE  [projectnumber] LIKE '%' + @projectnumber + '%' 
       AND [siteno] LIKE '%' + @siteno + '%' 
       AND [person] LIKE '%' + @person + '%' 
       AND [subatpdate] LIKE '%' + @subatpdate + '%' 
       AND [projectname] LIKE '%' + @projectname + '%' 
       AND [priorsurveyor] LIKE '%' + @priorsurveyor + '%' 
       AND [siteaddress] LIKE '%' + @siteaddress + '%' 
       AND [sitecity] LIKE '%' + @sitecity + '%' 
       AND [sitestate] LIKE '%' + @sitestate + '%' 
       AND [sitezip] LIKE '%' + @sitezip + '%' 
       AND [survey] LIKE '%' + @survey + '%' 
       AND [zoning] LIKE '%' + @zoning + '%' 
       AND [environmental] LIKE '%' + @environmental + '%' 
       AND [emg_projectnumber] LIKE '%' + @emg_projectnumber + '%' 
       AND [zoning_projectnumber] LIKE '%' + @zoning_projectnumber + '%' 
       AND [surveyor_projectnumber] LIKE '%' + @surveyor_projectnumber + '%' "

2 回目の試行では、null 値をチェックします。プロジェクト マネージャーとして "Jim" を入力した場合を除いて、これは少しうまく機能します。また、プロジェクト マネージャーの値として null を持つすべてのレコードが返されます。

       <ListDataSource CommandText="
SELECT [surveyid], 
       [projectnumber], 
       [siteno], 
       [person], 
       [subatpdate], 
       [projectname], 
       [priorsurveyor], 
       [siteaddress], 
       [sitecity], 
       [sitestate], 
       [sitezip], 
       [survey], 
       [zoning], 
       [environmental], 
       [emg_projectnumber], 
       [zoning_projectnumber], 
       [surveyor_projectnumber] 
FROM   tblrawprojectdatabase 
WHERE  ( [projectnumber] LIKE '%' + @projectnumber + '%' 
          OR [projectnumber] IS NULL ) 
       AND ( [siteno] LIKE '%' + @siteno + '%' 
              OR [siteno] IS NULL ) 
       AND ( [person] LIKE '%' + @person + '%' 
              OR [person] IS NULL ) 
       AND ( [priorsurveyor] LIKE '%' + @priorsurveyor + '%' 
              OR [priorsurveyor] IS NULL ) 
       AND ( [siteaddress] LIKE '%' + @siteaddress + '%' 
              OR [siteaddress] IS NULL ) 
       AND ( [sitecity] LIKE '%' + @sitecity + '%' 
              OR [sitecity] IS NULL ) 
       AND ( [sitestate] LIKE '%' + @sitestate + '%' 
              OR [sitestate] IS NULL ) 
       AND ( [sitezip] LIKE '%' + @sitezip + '%' 
              OR [sitezip] IS NULL ) 
       AND ( [survey] LIKE '%' + @survey + '%' 
              OR [survey] IS NULL ) 
       AND ( [zoning] LIKE '%' + @zoning + '%' 
              OR [zoning] IS NULL ) 
       AND ( [environmental] LIKE '%' + @environmental + '%' 
              OR [environmental] IS NULL ) 
       AND ( [emg_projectnumber] LIKE '%' + @emg_projectnumber + '%' 
              OR [emg_projectnumber] IS NULL ) 
       AND ( [zoning_projectnumber] LIKE '%' + @zoning_projectnumber + '%' 
              OR [zoning_projectnumber] IS NULL ) 
       AND ( [surveyor_projectnumber] LIKE '%' + @surveyor_projectnumber + '%' 
              OR [surveyor_projectnumber] IS NULL ) "

最初の条件が満たされた場合に null をチェックできないように、OR を使用して短絡評価として機能させる方法はありますか?

ありがとう、検索クエリを実行する方法に関する推奨事項は素晴らしいでしょう。

アップデート:

最初の投稿で省略した貴重な情報は、XModPro という DotNetNuke モジュールを使用しているという事実です。モジュールがタグの使用を制限しているため、ASPでクエリを作成する必要がある条件付きおよびループロジックを正常に使用する方法を認識していません(私が見る限り、ifステートメントとselectステートメントのみを提供し、変数を作成します必要以上に複雑に使用します)

4

2 に答える 2

0

これはどうですか、一時テーブルにすべてを追加して、必要なものをすべて削除して、一時テーブルから返します。

SELECT [surveyid], [projectnumber], [siteno], [person], [subatpdate], [projectname], 
[priorsurveyor], [siteaddress], [sitecity], [sitestate], [sitezip], [survey], [zoning], 
[environmental], [emg_projectnumber], [zoning_projectnumber], [surveyor_projectnumber] 
INTO #temp
FROM tblRawProjectDatabase
 WHERE ([projectnumber] LIKE '%' + @projectnumber + '%' OR [projectnumber] IS NULL) AND 
([siteno] LIKE '%' + @siteno + '%' OR [siteno] IS NULL) AND 
([person] LIKE '%' + @person + '%' OR [person] IS NULL) AND 
([priorsurveyor] LIKE '%' + @priorsurveyor + '%' OR [priorsurveyor] IS NULL) AND 
([siteaddress] LIKE '%' + @siteaddress + '%' OR [siteaddress] IS NULL) AND 
([sitecity] LIKE '%' + @sitecity + '%' OR [sitecity] IS NULL) AND 
([sitestate] LIKE '%' + @sitestate + '%' OR [sitestate] IS NULL) AND 
([sitezip] LIKE '%' + @sitezip + '%' OR [sitezip] IS NULL) AND 
([survey] LIKE '%' + @survey + '%' OR [survey] IS NULL) AND 
([zoning] LIKE '%' + @zoning + '%' OR [zoning] IS NULL) AND 
([environmental] LIKE '%' + @environmental + '%' OR [environmental] IS NULL) AND 
([emg_projectnumber] LIKE '%' + @emg_projectnumber + '%' OR [emg_projectnumber] IS NULL) AND 
([zoning_projectnumber] LIKE '%' + @zoning_projectnumber + '%' OR [zoning_projectnumber] IS NULL) AND 
([surveyor_projectnumber] LIKE '%' + @surveyor_projectnumber + '%' OR [surveyor_projectnumber] IS NULL)

DELETE FROM #temp WHERE ProjectManaer IS NULL
SELECT * FROM #temp
DROP TABLE #temp
于 2013-04-18T00:53:12.987 に答える