0

WHERE 句に問題があります (SQL 2008 を使用)。7 つのパラメーターに基づいて結果のリストを返すストアド プロシージャを作成する必要があり、そのうちのいくつかは null である可能性があります。問題があるのは、@elements、@categories、および @edu_id です。ID のリストにすることも、null にすることもできます。パラメータがnullでない場合、私の特定のコードが機能することをwhere句で確認できます。それらがnullの場合、SQLをコーディングする方法がわかりません。データベース内のフィールドは INT です。

私の質問が十分に明確であることを願っています。以下は私のクエリです。

BEGIN
DECLARE @elements nvarchar(30)
DECLARE @jobtype_id INT
DECLARE @edu_id nvarchar(30)
DECLARE @categories nvarchar(30)
DECLARE @full_part bit
DECLARE @in_demand bit
DECLARE @lang char(2)

SET @jobtype_id = null
SET @lang = 'en'
SET @full_part = null -- full = 1, part = 0
SET @elements = '1,2,3'
SET @categories = '1,2,3'
SET @edu_id = '3,4,5'

select 
jobs.name_en,
parttime.fulltime_only,
jc.cat_id category,
je.element_id elem,
jt.name_en jobtype,
jobs.edu_id minEdu,
education.name_en edu
from jobs
left join job_categories jc
on (jobs.job_id = jc.job_id)
left join job_elements je
on (jobs.job_id = je.job_id)
left join job_type jt
on (jobs.jobtype_id = jt.jobtype_id)
left join education
on (jobs.edu_id = education.edu_id)
left join 
(select job_id, case when (jobs.parttime_en IS NULL OR jobs.parttime_en = '') then 1 else 0 end fulltime_only from jobs) as parttime
on jobs.job_id = parttime.job_id
where [disabled] = 0    
and jobs.jobtype_id = isnull(@jobtype_id,jobs.jobtype_id)
and fulltime_only = isnull(@full_part,fulltime_only)
-- each of the following clauses should be validated to see if the parameter is null
-- if it is, the clause should not be used, or the SELECT * FROM ListToInt... should be replaced by 
-- the field evaluated: ie if @elements is null, je.element_id in (je.element_id)
and je.element_id IN (SELECT * FROM ListToInt(@elements,','))
and jc.cat_id IN (SELECT * FROM ListToInt(@categories,','))
and education.edu_id IN (SELECT * FROM ListToInt(@edu_id,','))

order by case when @lang='fr' then jobs.name_fr else jobs.name_en end;  

END
4

3 に答える 3

2

何かのようなもの

and (@elements IS NULL OR je.element_id IN 
(SELECT * FROM ListToInt(@elements,',')))
and (@categories IS NULL OR 
jc.cat_id IN (SELECT * FROM ListToInt(@categories,',')))
....

トリックを行う必要があります

于 2013-05-01T18:21:44.743 に答える
0

明示的に NULL と比較してみましたか?

and (@elements is null or je.element_id IN (SELECT * FROM ListToInt(@elements,','))

等々。

于 2013-05-01T18:21:51.833 に答える
0
je.element_id IN (SELECT * FROM ListToInt(@elements,',')) OR @elements IS NULL

それぞれにそのように

于 2013-05-01T18:21:48.350 に答える